详解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的Tornado框架中的协程异步实现原理
Apr 23 Python
利用python生成一个导出数据库的bat脚本文件的方法
Dec 30 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
Mar 30 Python
Python利用openpyxl库遍历Sheet的实例
May 03 Python
python实时检测键盘输入函数的示例
Jul 17 Python
Python获取时间范围内日期列表和周列表的函数
Aug 05 Python
python连接、操作mongodb数据库的方法实例详解
Sep 11 Python
使用Rasterio读取栅格数据的实例讲解
Nov 26 Python
使用pytorch实现可视化中间层的结果
Dec 30 Python
python用pip install时安装失败的一系列问题及解决方法
Feb 24 Python
Python函数的迭代器与生成器的示例代码
Jun 18 Python
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
May 25 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的ASCII码转换类
2013/07/05 PHP
PHP session_start()问题解疑(详细介绍)
2013/07/05 PHP
php实例分享之mysql数据备份
2014/05/19 PHP
PHP中preg_match函数正则匹配的字符串长度问题
2015/05/27 PHP
PHP getName()函数讲解
2019/02/03 PHP
Array 重排序方法和操作方法的简单实例
2014/01/24 Javascript
javascript类型转换示例
2014/04/29 Javascript
jQuery原型属性和原型方法详解
2015/07/07 Javascript
深入浅析JavaScript中with语句的理解
2016/05/12 Javascript
angularjs 表单密码验证自定义指令实现代码
2016/10/27 Javascript
Bootstrap modal 多弹窗之叠加引起的滚动条遮罩阴影问题
2017/02/27 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
2017/12/18 Javascript
详解NODEJS的http实现
2018/01/04 NodeJs
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
AngularJs1.x自定义指令独立作用域的函数传入参数方法
2018/10/09 Javascript
详解vue 兼容IE报错解决方案
2018/12/29 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
在LayUI图片上传中,解决由跨域问题引起的请求接口错误的方法
2019/09/24 Javascript
Vue列表循环从指定下标开始的多种解决方案
2020/04/08 Javascript
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
[46:40]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python用GET方法上传文件
2015/03/10 Python
Python自定义scrapy中间模块避免重复采集的方法
2015/04/07 Python
Python删除windows垃圾文件的方法
2015/07/14 Python
机器学习经典算法-logistic回归代码详解
2017/12/22 Python
python+tkinter实现学生管理系统
2019/08/20 Python
Python2.6版本pip安装步骤解析
2020/08/17 Python
python 删除系统中的文件(按时间,大小,扩展名)
2020/11/19 Python
自行车租赁公司创业计划书
2014/01/28 职场文书
小学生评语大全
2014/04/18 职场文书
实习单位指导教师评语
2014/12/30 职场文书
工程进度款催款函
2015/06/24 职场文书
大卫科波菲尔读书笔记
2015/06/30 职场文书
解除租赁合同协议书
2016/03/21 职场文书
清空 Oracle 安装记录并重新安装
2022/04/26 Oracle
MySQL数据库实验实现简单数据库应用系统设计
2022/06/21 MySQL