详解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编程求质数实例代码
Jan 31 Python
python验证码识别实例代码
Feb 03 Python
Python3读取Excel数据存入MySQL的方法
May 04 Python
Tensorflow实现卷积神经网络的详细代码
May 24 Python
Python实现Dijkstra算法
Oct 17 Python
对python中词典的values值的修改或新增KEY详解
Jan 20 Python
Python OOP类中的几种函数或方法总结
Feb 22 Python
使用Matplotlib 绘制精美的数学图形例子
Dec 13 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
May 09 Python
python爬虫调度器用法及实例代码
Nov 30 Python
手把手教你配置JupyterLab 环境的实现
Feb 02 Python
浅谈Python响应式类库RxPy
Jun 14 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
解决中英文字符串长度问题函数
2007/01/16 PHP
php更新修改excel中的内容实例代码
2014/02/26 PHP
PHP 之 写时复制介绍(Copy On Write)
2014/05/13 PHP
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
php写入文件不覆盖的实例讲解
2019/09/17 PHP
JS俄罗斯方块,包含完整的设计理念
2010/12/11 Javascript
js的一些常用方法小结
2011/06/29 Javascript
3款实用的在线JS代码工具(国外)
2012/03/15 Javascript
基于jquery异步传输json数据格式实例代码
2013/11/23 Javascript
Backbone中View之间传值的学习心得
2016/08/09 Javascript
javascript输出AscII码扩展集中的字符方法
2016/12/26 Javascript
jQuery和CSS仿京东仿淘宝列表导航菜单
2017/01/04 Javascript
JavaScript创建对象方法实例小结
2018/09/03 Javascript
关于layui flow loading占位图的实现方法
2019/09/21 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
js实现拾色器插件(ColorPicker)
2020/05/21 Javascript
Vue切换div显示隐藏,多选,单选代码解析
2020/07/14 Javascript
springboot+vue实现文件上传下载
2020/11/17 Vue.js
[06:21]2014DOTA2国际邀请赛 庆祝VG首阶段领跑;B叔为挣牛排半夜整理情报
2014/07/13 DOTA
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
Python下的subprocess模块的入门指引
2015/04/16 Python
python通过微信发送邮件实现电脑关机
2018/06/20 Python
Sanic框架安装与简单入门示例
2018/07/16 Python
python使用opencv驱动摄像头的方法
2018/08/03 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
Django重设Admin密码过程解析
2020/02/10 Python
Python 常用日期处理 -- calendar 与 dateutil 模块的使用
2020/09/02 Python
微软开源最强Python自动化神器Playwright(不用写一行代码)
2021/01/05 Python
小学运动会广播稿200字(十二篇)
2014/01/14 职场文书
《晏子使楚》教学反思
2014/02/08 职场文书
《秋姑娘的信》教学反思
2014/02/28 职场文书
2014年关于两会精神的心得体会
2014/03/17 职场文书
心得体会的写法
2014/09/05 职场文书
欠条样本
2015/07/03 职场文书
html form表单基础入门案例讲解
2021/07/15 HTML / CSS
浅谈Java父子类加载顺序
2021/08/04 Java/Android