Django的模板语言包含了各种各样的内置标签和过滤器来满足你的应用需求,不过有时候你也会发现你的需要的功能不在内置的功能中,这时候你可以通过Python语言自定义标签和过滤器来扩展模板引擎,然后在你的模板中使用 {% load %} 来加载使用它们。
首先创建好包文件:
在你的app下创建templatetags包,在其下创建python脚本来定义你的标签和过滤器page.py文件,特别注意里面的__init__.py文件,它告诉Python这里是一个包,格式如:
myapp/
__init__.py
templatetags/
__init__.py
page.py
views.py
models.py
接着编写page.py文件的内容
# -*- coding: utf-8 -*-
#这里先导入模板库
from django import template
register=template.Library()
#自定义自己的过滤器,将传入发字符串转为大写
@register.filter
def my_upper(val):
print('val from template:',val)
return val.upper()
#自定义标签
from django.utils.html import format_html
@register.simple_tag
def circle_page(curr_page,loop_page):
offset=abs(curr_page-loop_page)
if offset<3:
if curr_page==loop_page:
page_ele='<li class="liactive"><a class="selected" href="/backstage/test/?page=%s">%s</a></li>'%(loop_page,loop_page)
else:
page_ele='<li class="itemli"><a href="/backstage/test/?page=%s">%s</a></li>'%(loop_page,loop_page)
return format_html(page_ele)
else:
return ''
在需要进行引入的.html文件的最上方中,增加如下,将文件引入:
{% load page %}
在具体需要过滤的地方,引入我们page.py文件中定义的函数:
<span class="sourse" >{{ video.source }} | my_upper</span> {#这里将video.source的值传入my_upper()函数进行处理#}
在需要自定义标签的地方,引入:
{# 页码开始#}
{% for num in paginator.page_range %}
{% circle_page currentPage num %} {# 这里就是我们自定义的标签,circle_page是期末前面自定义的函数,currentPage和num是我们传入的参数,当前页码和循环页码#}
{% endfor %}
{#页码结束#}