详解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代码制作configure文件示例
Jul 28 Python
Python的Django框架中从url中捕捉文本的方法
Jul 20 Python
python基础教程之匿名函数lambda
Jan 17 Python
Python引用传值概念与用法实例小结
Oct 07 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
Jul 02 Python
pytorch 更改预训练模型网络结构的方法
Aug 19 Python
python接口调用已训练好的caffe模型测试分类方法
Aug 26 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
Apr 20 Python
tensorflow2.0的函数签名与图结构(推荐)
Apr 28 Python
Python unittest如何生成HTMLTestRunner模块
Sep 08 Python
PyTorch 如何自动计算梯度
May 23 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获取文件绝对路径的代码(上一级目录)
2011/05/29 PHP
php输出图像的方法实例分析
2017/02/16 PHP
PHP实现的各类hash算法长度及性能测试实例
2017/08/27 PHP
Laravel使用RabbitMQ的方法示例
2019/06/18 PHP
麦鸡的TAB切换功能结合了javascript和css
2007/12/17 Javascript
extjs grid取到数据而不显示的解决
2008/12/29 Javascript
菜鸟学习JavaScript小实验之函数引用
2010/11/17 Javascript
深入学习JavaScript中的原型prototype
2015/08/13 Javascript
异步JS框架的作用以及实现方法
2015/10/29 Javascript
JS截取与分割字符串常用技巧总结
2015/11/10 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
2016/08/08 Javascript
js省市区级联查询(插件版&amp;无插件版)
2017/03/21 Javascript
在 Angular 中使用Chart.js 和 ng2-charts的示例代码
2017/08/17 Javascript
nodejs结合Socket.IO实现的即时通讯功能详解
2018/01/12 NodeJs
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
2020/11/18 Vue.js
[03:24]2014DOTA2国际邀请赛 神秘商店生意火爆
2014/07/18 DOTA
python time模块用法实例详解
2014/09/11 Python
python基于BeautifulSoup实现抓取网页指定内容的方法
2015/07/09 Python
Python环境变量设置方法
2016/08/28 Python
python版本坑:md5例子(python2与python3中md5区别)
2017/06/20 Python
python利用smtplib实现QQ邮箱发送邮件
2020/05/20 Python
Flask框架web开发之零基础入门
2018/12/10 Python
CSS3 media queries + jQuery实现响应式导航
2016/09/30 HTML / CSS
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
HTML5中的Scoped属性使用实例
2014/04/23 HTML / CSS
System.Array.CopyTo()和System.Array.Clone()有什么区别
2016/06/20 面试题
医学专业五年以上个人求职信
2013/12/03 职场文书
新领导上任欢迎词
2014/01/13 职场文书
学习雷锋演讲稿
2014/05/10 职场文书
祖国在我心中演讲稿(小学生)
2014/09/23 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
酒店优秀员工推荐信
2015/03/24 职场文书
2015年党员公开承诺事项
2015/04/27 职场文书
大学班干部竞选稿
2015/11/20 职场文书
《落花生》教学反思
2016/02/16 职场文书
SQLServer2008提示评估期已过解决方案
2021/04/12 SQL Server