详解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中利用Into包整洁地进行数据迁移的教程
Mar 30 Python
python检查字符串是否是正确ISBN的方法
Jul 11 Python
python学习笔记之调用eval函数出现invalid syntax错误问题
Oct 18 Python
简要讲解Python编程中线程的创建与锁的使用
Feb 28 Python
Python正则表达式经典入门教程
May 22 Python
获取python文件扩展名和文件名方法
Feb 02 Python
浅析Python 中几种字符串格式化方法及其比较
Jul 02 Python
python 用户交互输入input的4种用法详解
Sep 24 Python
python3 tkinter实现添加图片和文本
Nov 26 Python
解决windows下python3使用multiprocessing.Pool出现的问题
Apr 08 Python
Python 如何对文件目录操作
Jul 10 Python
经验丰富程序员才知道的8种高级Python技巧
Jul 27 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+AJAX实现无刷新注册(带用户名实时检测)
2007/01/02 PHP
php 截取字符串并以零补齐str_pad() 函数
2011/05/07 PHP
PHP实现下载功能的代码
2012/09/29 PHP
一些php项目中比较通用的php自建函数的详解
2013/06/06 PHP
Laravel实现表单提交
2017/05/07 PHP
javascript 屏蔽鼠标键盘的几段代码
2008/01/02 Javascript
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
Javascript base64编码实现代码
2011/12/02 Javascript
创建你的第一个AngularJS应用的方法
2015/06/16 Javascript
JavaScript的instanceof运算符学习教程
2016/06/08 Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
2016/06/22 Javascript
angular4自定义组件详解
2017/09/28 Javascript
JS实现瀑布流布局
2017/10/21 Javascript
jquery-file-upload 文件上传带进度条效果
2017/11/21 jQuery
MVVM 双向绑定的实现代码
2018/06/21 Javascript
Vue弹出菜单功能的实现代码
2018/09/12 Javascript
JS浅拷贝和深拷贝原理与实现方法分析
2019/02/28 Javascript
Python set集合类型操作总结
2014/11/07 Python
Python中操作MySQL入门实例
2015/02/08 Python
tensorflow实现图像的裁剪和填充方法
2018/07/27 Python
DES加密解密算法之python实现版(图文并茂)
2018/12/06 Python
Python实现FTP弱口令扫描器的方法示例
2019/01/31 Python
深入了解和应用Python 装饰器 @decorator
2019/04/02 Python
Django model update的多种用法介绍
2020/03/28 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
使用python脚本自动创建pip.ini配置文件代码实例
2019/09/20 Python
Python计算公交发车时间的完整代码
2020/02/12 Python
德国二手设计师时装和复古时装跳蚤市场:Mädchenflohmarkt
2020/11/09 全球购物
学习党章思想汇报
2014/01/07 职场文书
毕业班联欢会主持词
2014/03/27 职场文书
大学生撤销处分思想汇报
2014/09/12 职场文书
餐厅感恩节活动策划方案
2014/10/11 职场文书
学生评语集锦
2015/01/04 职场文书
2015国庆节宣传语
2015/07/14 职场文书
2015大学迎新晚会主持词
2015/07/16 职场文书
总结三种用 Python 作为小程序后端的方式
2022/05/02 Python