详解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中optionParser模块的使用方法实例教程
Aug 29 Python
python遍历目录的方法小结
Apr 28 Python
Python中字符串的常见操作技巧总结
Jul 28 Python
python实现linux下抓包并存库功能
Jul 18 Python
对Python的zip函数妙用,旋转矩阵详解
Dec 13 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
Oct 18 Python
python3 字符串知识点学习笔记
Feb 08 Python
解决c++调用python中文乱码问题
Jul 29 Python
python实现猜拳游戏项目
Nov 30 Python
python自动化发送邮件实例讲解
Jan 04 Python
Django cookie和session的应用场景及如何使用
Apr 29 Python
Python读写yaml文件
Mar 20 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
vBulletin HACK----关于排版的两个HACK
2006/10/09 PHP
PHP 网页过期时间的控制代码
2009/06/29 PHP
Windows下利用Gvim写PHP产生中文乱码问题解决方法
2011/04/20 PHP
php header Content-Type类型小结
2011/07/03 PHP
PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
2012/07/15 PHP
php中字符集转换iconv函数使用总结
2014/10/11 PHP
php中socket的用法详解
2014/10/24 PHP
PHP中error_log()函数的使用方法
2015/01/20 PHP
PHP+MySql+jQuery实现的&quot;顶&quot;和&quot;踩&quot;投票功能
2016/05/21 PHP
PHP后台实现微信小程序登录
2018/08/03 PHP
Jquery中对数组的操作代码
2011/08/12 Javascript
js 时间格式与时间戳的相互转换示例代码
2013/12/25 Javascript
使用Node.js为其他程序编写扩展的基本方法
2015/06/23 Javascript
Angular Js文件上传之form-data
2015/08/28 Javascript
Three.js学习之文字形状及自定义形状
2016/08/01 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
微信小程序 解决swiper不显示图片的方法
2017/01/04 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
详解React之key的使用和实践
2018/09/29 Javascript
vue项目中将element-ui table表格写成组件的实现代码
2019/06/12 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
2020/08/27 Javascript
Python3中多线程编程的队列运作示例
2015/04/16 Python
python开发之for循环操作实例详解
2015/11/12 Python
python利用多种方式来统计词频(单词个数)
2019/05/27 Python
Python 实现训练集、测试集随机划分
2020/01/08 Python
django为Form生成的label标签添加class方式
2020/05/20 Python
what is the difference between ext2 and ext3
2013/11/03 面试题
中学生团员自我评价分享
2013/12/07 职场文书
小区消防演习方案
2014/02/21 职场文书
《孔子拜师》教学反思
2014/02/24 职场文书
分公司任命书
2014/06/06 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
2015年保险公司个人工作总结
2015/05/22 职场文书
《1942》观后感
2015/06/08 职场文书
学习nginx基础知识
2021/09/04 Servers
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
2022/05/30 NodeJs