Django模板——自定义标签
标签比过滤器更复杂,因为标签可以做任何事情。Django提供了许多快捷方式,可以更轻松地编写大多数类型的标签。首先,我们将探讨这些快捷方式,然后解释如何在快捷方式不够强大的情况下从头开始编写标签。
1.简单标签
1.1创建
同过滤器,在app目录下创建模块,定义方法。
1.2注册
#与过滤器雷同,Library().simple_tag
from django.template import Library
register = Library()
@register.simple_tag(name='curTime')
def cur_time(formt_str):
return datetime.now().strftime(formt_str)
'''
也可以函数注册
register.simple_tag(name='curTime', func=cur_time)
'''
1.3引用上下文
如果模板标记需要访问当前上下文,则可以在注册标记时使用参数takes_context
:
如果takes_context
在创建模板标记时指定,则标记将没有必需的参数,并且基础Python函数将具有一个参数 - 从调用标记时开始的模板上下文。
#请注意,必须调用第一个参数context。
from datetime import datetime
from django.template import Library
register = Library()
@register.simple_tag(name='curTime', takes_context=True)
def cur_time(context):
formt_str = context.get('format_str')
return datetime.now().strftime(formt_str)
2.包含标签
展示的是渲染的另一个模板,在当前模板进行扩展内容,故而叫inclusion_tag
2.1定义
2.1.1 定义函数
接受调用时传递的模板变量,定义接受参数的函数并为结果生成数据字典。这里重点是我们只需要返回字典,而不是更复杂的字典。这将用作模板片段的模板上下文。
#filename 是输出模板的位置
@register.inclusion_tag(filename='custom_tags/list_to_ul.html')
def list_to_ul(value):
return {'iterator': value}
#字典的key在输出模板要用到
2.1.2定义模板
创建用于呈现标记输出的模板。此模板是标记的固定功能:标记编写器指定它,而不是模板设计器。按照我们的示例,模板非常简单:
<!--project/templates/custom_tags/list_to_ul.html-->
<ul>
{% for item in iterator %} <!--iterator:函数返回字典的key-->
<li> {{ item }} </li>
{% endfor %}
</ul>
2.2使用
#project/app/views.py
def index(request):
context = {
'format_str': '%Y-%M-%D %H:%M:%S',
'fruits': ['苹果', '葡萄', '桃子'],
}
return render(request, 'book/index.html', context=context)
<!--调用标签-->
列表:{% list_to_ul fruits %}
3.分配标签
类似于简单标签,但并不会输出结果,可以使用 as 关键字将结果赋给一个参数。
@register.assignment_tag
def get_current_time(format_string):
return datetime.datetime.now().strftime(format_string)
{% get_current_time "%Y-%m-%d %I:%M %p" as the_time %}
<p>The time is {{ the_time }}.</p>