详解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实现的udp协议Server和Client代码实例
Jun 04 Python
python中正则表达式的使用详解
Oct 17 Python
python 循环while和for in简单实例
Aug 16 Python
TensorFlow利用saver保存和提取参数的实例
Jul 26 Python
python 为什么说eval要慎用
Mar 26 Python
Python定时发送天气预报邮件代码实例
Sep 09 Python
Django REST Framework之频率限制的使用
Sep 29 Python
Django多进程滚动日志问题解决方案
Dec 17 Python
Python requests模块cookie实例解析
Apr 14 Python
解决Opencv+Python cv2.imshow闪退问题
Apr 24 Python
基于PyTorch的permute和reshape/view的区别介绍
Jun 18 Python
python定时截屏实现
Nov 02 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
CI框架中libraries,helpers,hooks文件夹详细说明
2014/06/10 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
2016/11/05 PHP
Yii 使用intervention/image拓展实现图像处理功能
2019/06/22 PHP
laravel5.1 ajax post 传值_token示例
2019/10/24 PHP
jquery移除、绑定、触发元素事件使用示例详解
2014/04/10 Javascript
jquery实现带二级菜单的导航示例
2014/04/28 Javascript
Egret引擎开发指南之发布项目
2014/09/03 Javascript
javascript中字符串拼接详解
2014/09/26 Javascript
浅谈JavaScript的自动垃圾收集机制
2016/12/15 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
三种方式实现瀑布流布局
2017/02/10 Javascript
js中let和var定义变量的区别
2018/02/08 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
浅谈PDF.js使用心得
2018/06/07 Javascript
使用vue的transition完成滑动过渡的示例代码
2018/06/25 Javascript
layer弹出层 iframe层去掉滚动条的实例代码
2018/08/17 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
VUE安装使用教程详解
2019/06/03 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
2019/07/20 Javascript
jQuery弹框插件使用方法详解
2020/05/26 jQuery
vue项目中js-cookie的使用存储token操作
2020/11/13 Javascript
python进阶教程之循环相关函数range、enumerate、zip
2014/08/30 Python
linux 下实现python多版本安装实践
2014/11/18 Python
剖析Python的Tornado框架中session支持的实现代码
2015/08/21 Python
Python提取网页中超链接的方法
2016/09/18 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
python人民币小写转大写辅助工具
2018/06/20 Python
Python 实现遥感影像波段组合的示例代码
2019/08/04 Python
Pytorch mask-rcnn 实现细节分享
2020/06/24 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
2020/10/04 Python
详解CSS3浏览器兼容
2016/12/14 HTML / CSS
决心书标准格式
2014/03/11 职场文书
数控专业毕业生求职信
2014/06/12 职场文书
2015年班主任个人工作总结
2015/03/31 职场文书
和谐拯救危机观后感
2015/06/15 职场文书
golang goroutine顺序输出方式
2021/04/29 Golang