详解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 21 Python
python同时给两个收件人发送邮件的方法
Apr 30 Python
python语言使用技巧分享
May 31 Python
Python实现冒泡排序的简单应用示例
Dec 11 Python
django admin添加数据自动记录user到表中的实现方法
Jan 05 Python
Python内存管理实例分析
Jul 10 Python
Python逐行读取文件内容的方法总结
Feb 14 Python
基于Python绘制个人足迹地图
Jun 01 Python
python如何随机生成高强度密码
Aug 19 Python
python cookie反爬处理的实现
Nov 01 Python
基于Python实现全自动下载抖音视频
Nov 06 Python
python给list排序的简单方法
Dec 10 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中strtr字符串替换用法详解
2014/11/26 PHP
php关联数组与索引数组及其显示方法
2018/03/12 PHP
关于event.cancelBubble和event.stopPropagation()的区别介绍
2011/12/11 Javascript
面向对象继承实例(a如何继承b问题)(自写)
2013/07/01 Javascript
js控制表单奇偶行样式的简单方法
2013/07/31 Javascript
JavaScript+CSS控制打印格式示例介绍
2014/01/07 Javascript
javascript顺序加载图片的方法
2015/07/18 Javascript
jQuery无刷新上传之uploadify简单代码
2017/01/17 Javascript
js实现文字选中分享功能
2017/01/25 Javascript
jQuery排序插件tableSorter使用方法
2017/02/10 Javascript
seajs中模块依赖的加载处理实例分析
2017/10/10 Javascript
解决vue 中 echart 在子组件中只显示一次的问题
2018/08/07 Javascript
nodejs基础之buffer缓冲区用法分析
2018/12/26 NodeJs
vuex实现的简单购物车功能示例
2019/02/13 Javascript
少女风vue组件库的制作全过程
2019/05/15 Javascript
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
2019/09/02 Javascript
element实现合并单元格通用方法
2019/11/13 Javascript
浅谈Vue组件单元测试究竟测试什么
2020/02/05 Javascript
vue实现购物车案例
2020/05/30 Javascript
JavaScript字符和ASCII实现互相转换
2020/06/03 Javascript
python实现代理服务功能实例
2013/11/15 Python
Python内存读写操作示例
2018/07/18 Python
Python进阶之全面解读高级特性之切片
2019/02/19 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
2019/06/14 Python
python写日志文件操作类与应用示例
2019/07/01 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
2020/01/04 Python
keras 读取多标签图像数据方式
2020/06/12 Python
CSS3 calc()会计算属性详解
2018/02/27 HTML / CSS
军训自我鉴定100字
2014/02/13 职场文书
中学生励志演讲稿
2014/04/26 职场文书
青年志愿者先进事迹
2014/05/06 职场文书
2015年感恩父亲节活动策划方案
2015/05/05 职场文书
position:sticky 粘性定位的几种巧妙应用详解
2021/04/24 HTML / CSS
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技
利用正则表达式匹配浮点型数据
2022/05/30 Java/Android