详解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 网络爬虫初级实现代码
Feb 27 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
Jun 13 Python
python+matplotlib实现礼盒柱状图实例代码
Jan 16 Python
对python中数组的del,remove,pop区别详解
Nov 07 Python
解决python测试opencv时imread导致的错误问题
Jan 26 Python
详解Python字典的操作
Mar 04 Python
使用opencv中匹配点对的坐标提取方式
Jun 04 Python
使用Keras实现Tensor的相乘和相加代码
Jun 18 Python
python实现在列表中查找某个元素的下标示例
Nov 16 Python
python 实现表情识别
Nov 21 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
Mar 03 Python
Python中的datetime包与time包包和模块详情
Feb 28 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中使用Memache作为进程锁的操作类分享
2015/03/30 PHP
Thinkphp3.2.3分页使用实例解析
2016/07/28 PHP
PHP如何使用cURL实现Get和Post请求
2020/07/11 PHP
js函数的延迟加载实现代码
2012/10/11 Javascript
基于OO的动画附加插件,可以实现弹跳、渐隐等动画效果 分享
2013/06/24 Javascript
Jquery显示、隐藏元素以及添加删除样式
2013/08/09 Javascript
JS检测输入字符是否包含非法字符的示例代码
2014/02/11 Javascript
jQuery实现百叶窗焦点图动画效果代码分享(附源码下载)
2016/03/14 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
sso跨域写cookie的一段js脚本(推荐)
2016/05/25 Javascript
原生JS实现网络彩票投注效果
2016/09/25 Javascript
Vue+SpringBoot开发V部落博客管理平台
2017/12/27 Javascript
解决echarts图表使用v-show控制图表显示不全的问题
2020/07/19 Javascript
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
简单谈谈python中的语句和语法
2017/08/10 Python
python中使用PIL制作并验证图片验证码
2018/03/15 Python
python__name__原理及用法详解
2019/11/02 Python
python调用函数、类和文件操作简单实例总结
2019/11/29 Python
PyTorch学习:动态图和静态图的例子
2020/01/06 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
Django启动时找不到mysqlclient问题解决方案
2020/11/11 Python
雅诗兰黛旗下专业男士保养领导品牌:Lab Series
2017/05/15 全球购物
英国皇家邮政海外旗舰店:Royal Mail
2018/02/21 全球购物
印度在线购买电子产品网站:Croma
2020/01/02 全球购物
在C#中如何实现多态
2014/07/02 面试题
财务经理的岗位职责
2013/12/17 职场文书
评析教师个人的自我评价
2014/02/19 职场文书
主持词开场白
2014/03/17 职场文书
本科毕业生求职自荐信
2014/04/09 职场文书
三方股东合作协议书
2014/10/28 职场文书
出国留学英文自荐信
2015/03/25 职场文书
2015社区个人工作总结范文
2015/05/13 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书
python Polars库的使用简介
2021/04/21 Python
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers