详解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 相关文章推荐
urllib2自定义opener详解
Feb 07 Python
一个检测OpenSSL心脏出血漏洞的Python脚本分享
Apr 10 Python
python获取当前计算机cpu数量的方法
Apr 18 Python
python实现web方式logview的方法
Aug 10 Python
Python内置函数—vars的具体使用方法
Dec 04 Python
Python SVM(支持向量机)实现方法完整示例
Jun 19 Python
python实现小球弹跳效果
May 10 Python
Python高级特性 切片 迭代解析
Aug 23 Python
使用Keras加载含有自定义层或函数的模型操作
Jun 10 Python
Python使用Selenium模拟浏览器自动操作功能
Sep 08 Python
详解python的变量缓存机制
Jan 24 Python
python图像处理 PIL Image操作实例
Apr 09 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环境搭建最新方法
2006/09/05 PHP
学习php设计模式 php实现抽象工厂模式
2015/12/07 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
网站接入QQ登录的两种方法
2014/07/22 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
学习JavaScript设计模式(链式调用)
2015/11/26 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
Vue form 表单提交+ajax异步请求+分页效果
2017/04/22 Javascript
vue中使用localstorage来存储页面信息
2017/11/04 Javascript
javascript Function函数理解与实战
2017/12/01 Javascript
vue2.0实现前端星星评分功能组件实例代码
2018/02/12 Javascript
浅谈微信小程序列表埋点曝光指南
2019/10/15 Javascript
[57:41]Secret vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[01:11:02]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python实现的各种排序算法代码
2013/03/04 Python
详解Python的collections模块中的deque双端队列结构
2016/07/07 Python
python和ruby,我选谁?
2017/09/13 Python
Python3利用SMTP协议发送E-mail电子邮件的方法
2017/09/30 Python
python 读取txt中每行数据,并且保存到excel中的实例
2018/04/29 Python
python 3.6.2 安装配置方法图文教程
2018/09/18 Python
python 中不同包 类 方法 之间的调用详解
2020/03/09 Python
python selenium操作cookie的实现
2020/03/18 Python
使用Python FastAPI构建Web服务的实现
2020/06/08 Python
简单了解Python字典copy与赋值的区别
2020/09/16 Python
纯CSS3打造动感漂亮时尚的扇形菜单
2014/03/18 HTML / CSS
意大利综合购物网站:Giordano Shop
2016/10/21 全球购物
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
博柏利美国官方网站:Burberry美国
2020/11/19 全球购物
八年级英语教学反思
2014/01/09 职场文书
竞选班干部演讲稿400字
2014/08/20 职场文书
研究生导师推荐信
2015/03/25 职场文书
家长意见和建议怎么写
2015/06/04 职场文书
教师年度考核自我评鉴
2015/08/11 职场文书
详解redis在微服务领域的贡献
2021/10/16 Redis
GO中sync包自由控制并发示例详解
2022/08/05 Golang