详解Python的Django框架中inclusion_tag的使用


Posted in Python onJuly 21, 2015

另外一类常用的模板标签是通过渲染 其他 模板显示数据的。 比如说,Django的后台管理界面,它使用了自定义的模板标签来显示新增/编辑表单页面下部的按钮。 那些按钮看起来总是一样的,但是链接却随着所编辑的对象的不同而改变。 这就是一个使用小模板很好的例子,这些小模板就是当前对象的详细信息。

这些排序标签被称为 包含标签 。如何写包含标签最好通过举例来说明。 让我们来写一个能够产生指定作者对象的书籍清单的标签。 我们将这样利用标签:

{% books_for_author author %}

结果将会像下面这样:

<ul>
  <li>The Cat In The Hat</li>
  <li>Hop On Pop</li>
  <li>Green Eggs And Ham</li>
</ul>

首先,我们定义一个函数,通过给定的参数生成一个字典形式的结果。 需要注意的是,我们只需要返回字典类型的结果就行了,不需要返回更复杂的东西。 这将被用来作为模板片段的内容:

def books_for_author(author):
  books = Book.objects.filter(authors__id=author.id)
  return {'books': books}

接下来,我们创建用于渲染标签输出的模板。 在我们的例子中,模板很简单:

<ul>
{% for book in books %}
  <li>{{ book.title }}</li>
{% endfor %}
</ul>

最后,我们通过对一个 Library 对象使用 inclusion_tag() 方法来创建并注册这个包含标签。

在我们的例子中,如果先前的模板在 polls/result_snippet.html 文件中,那么我们这样注册标签:

register.inclusion_tag('book_snippet.html')(books_for_author)

Python 2.4装饰器语法也能正常工作,所以我们可以这样写:

@register.inclusion_tag('book_snippet.html')
def books_for_author(author):
  # ...

有时候,你的包含标签需要访问父模板的context。 为了解决这个问题,Django为包含标签提供了一个 takes_context 选项。 如果你在创建模板标签时,指明了这个选项,这个标签就不需要参数,并且下面的Python函数会带一个参数: 就是当这个标签被调用时的模板context。

例如,你正在写一个包含标签,该标签包含有指向主页的 home_link 和 home_title 变量。 Python函数会像这样:

@register.inclusion_tag('link.html', takes_context=True)
def jump_link(context):
  return {
    'link': context['home_link'],
    'title': context['home_title'],
  }

(注意函数的第一个参数 必须 是 context 。)

模板 link.html 可能包含下面的东西:

Jump directly to <a href="{{ link }}">{{ title }}</a>.

然后您想使用自定义标签时,就可以加载它的库,然后不带参数地调用它,就像这样:

{% jump_link %}
Python 相关文章推荐
Python实现的选择排序算法原理与用法实例分析
Nov 22 Python
python爬取拉勾网职位数据的方法
Jan 24 Python
Python实现求一个集合所有子集的示例
May 04 Python
pygame游戏之旅 调用按钮实现游戏开始功能
Nov 21 Python
Python列表list排列组合操作示例
Dec 18 Python
python 遍历列表提取下标和值的实例
Dec 25 Python
利用Pyhton中的requests包进行网页访问测试的方法
Dec 26 Python
详解django+django-celery+celery的整合实战
Mar 19 Python
opencv3/C++图像像素操作详解
Dec 10 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
Apr 13 Python
python 实现汉诺塔游戏
Nov 28 Python
Python find()、rfind()方法及作用
Dec 24 Python
剖析Django中模版标签的解析与参数传递
Jul 21 #Python
Python简单调用MySQL存储过程并获得返回值的方法
Jul 20 #Python
在Django的上下文中设置变量的方法
Jul 20 #Python
在Django中编写模版节点及注册标签的方法
Jul 20 #Python
在Python的Django框架中编写编译函数
Jul 20 #Python
Python的Django框架中自定义模版标签的示例
Jul 20 #Python
详解在Python的Django框架中创建模板库的方法
Jul 20 #Python
You might like
PHP的一个完整SMTP类(解决邮件服务器需要验证时的问题)
2006/10/09 PHP
php 修改zen-cart下单和付款流程以防止漏单
2010/03/08 PHP
php rsa加密解密使用详解
2015/01/14 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
2015/05/12 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
Angularjs制作简单的路由功能demo
2015/04/14 Javascript
基于JS实现的笛卡尔乘积之商品发布
2016/05/13 Javascript
浅谈DOCTYPE对$(window).height()取值的影响
2016/07/21 Javascript
学习vue.js中class与style绑定
2016/12/03 Javascript
nodeJs链接Mysql做增删改查的简单操作
2017/02/04 NodeJs
[原创]js实现保存文本框内容为本地文件兼容IE,chrome,火狐浏览器
2018/02/14 Javascript
Vue组件的使用及个人理解与介绍
2019/02/09 Javascript
原生js实现碰撞检测
2020/03/12 Javascript
[53:10]完美世界DOTA2联赛决赛日 FTD vs GXR 第二场 11.08
2020/11/11 DOTA
python中argparse模块用法实例详解
2015/06/03 Python
python常用函数详解
2016/09/13 Python
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
2018/08/30 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
2019/08/28 Python
关于sys.stdout和print的区别详解
2019/12/05 Python
django数据模型(Model)的字段类型解析
2019/12/25 Python
Python基于Socket实现简单聊天室
2020/02/17 Python
Python txt文件如何转换成字典
2020/11/03 Python
TensorFlow2.0使用keras训练模型的实现
2021/02/20 Python
使用python实现学生信息管理系统
2021/02/25 Python
CSS3教程:边框属性border的极致应用
2009/04/02 HTML / CSS
漫威玩具服装及周边商品官方购物网站:Marvel Shop
2019/05/11 全球购物
可爱的童装和鞋子:Fabkids
2019/08/16 全球购物
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
举例说明类变量和实例变量的区别
2016/06/30 面试题
古汉语文学求职信范文
2014/03/16 职场文书
劳动保障个人工作总结
2015/03/04 职场文书
严以用权学习心得体会
2016/01/12 职场文书
golang goroutine顺序输出方式
2021/04/29 Golang
在Docker容器中部署SQL Server
2022/04/11 Servers
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle
win10滚动条自动往上跑怎么办?win10滚动条自动往上跑的解决方法
2022/08/05 数码科技