Django自定义标签与过滤器开发指南
本文详细讲解如何在Django中创建和使用自定义标签与过滤器。内容涵盖从创建templatetags包、配置INSTALLED_APPS到编写具体逻辑的完整流程。重点介绍了Simple tags、Inclusion tags和Assignment tags三种自定义标签的实现方式,以及通过register.filter和装饰器注册过滤器的方法,帮助开发者扩展Django模板功能。
要实现Django的自定义标签和过滤器,首先需要完成必要的基础准备工作。
基础准备工作如下:
1. 在指定的App目录下创建一个名为templatetags的包。注意,包名必须严格为templatetags,不可更改。例如,在名为polls的App中创建该包,并在其下建立mytags.py文件,目录结构如下所示:
polls/
__init__.py
models.py
templatetags/
__init__.py
mytags.py
views.py
2. 确保settings配置文件中的INSTALLED_APPS列表中包含该App。请检查并确认INSTALLED_APPS变量中已注册polls应用。
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'polls', )
3. 在mytags.py文件中编写以下基础代码:
from django import template register = template.Library()
4. 在HTML模板中,使用{% load %}标签加载自定义的标签或过滤器。
{% load mytags %}
接下来介绍自定义过滤器的实现方法:
1. 自定义过滤器的核心是编写一个Python函数。
2. Django模板引擎会将过滤器左侧的值作为参数传递给该函数。
3. 函数编写完成后,必须通过register机制进行注册登记。
由于Django会自动处理参数传递过程,开发者只需专注于第一步(编写函数)和第三步(注册函数)。
示例:实现一个自动截断多余字符串的过滤器。
1. 定义名为truncate_chars的处理函数。
# 若字符串长度大于30,则省略之后的内容,否则原样输出该字符串。参数value就是过滤器前的值
def truncate_chars(value):
if value.__len__() > 30:
return '%s......'% value[0:30]
else:
return value
2. 对该函数进行注册。
# 登记
register.filter('truncate_chars',truncate_chars)
def truncate_chars(value):
if value.__len__() > 30:
return '%s......'% value[0:30]
else:
return value
调用Library.filter(name, function, is_safe=False, needs_autoescape=False, excepts_localtime=False)时,默认需要提供两个参数:name为过滤器的名称(字符串类型),function为对应的函数对象。其余三个可选参数可参考官方文档。此外,也可以使用装饰器方式进行注册。
@register.filter(name='truncate_filter')
def truncate_chars(value):
if value.__len__() > 30:
return '%s......'% value[0:30]
else:
return value
如果省略name参数,Django默认将函数名作为过滤器的名称。因此,以下代码与上述注册方式效果一致。
@register.filter
def truncate_chars(value):
if value.__len__() > 30:
return '%s......'% value[0:30]
else:
return value
3. 在测试模板文件中编写调用代码。
{% load mytags %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ 'alskdjasdfasdfasdffasdfasdfasdffasdffasdffasdffasdfasdffasdffalskdjasdfasdfasdffasdfasdfasdffasdffasdffasdffasdfasdffasdff'|truncate_chars }}
</body>
</html>
4. 通过浏览器访问页面,查看最终显示结果。

关于自定义标签的说明:
与过滤器相比,自定义标签的实现更为复杂,因为其功能更加强大,可以执行任意操作。
Django中的自定义标签主要分为以下几种类型:
1. 简单标签(Simple tags)
2. 内含标签(Inclusion tags)
3. 分配标签(Assignment tags)
一、简单标签(Simple tags)
import datetime from django import template register = template.Library() @register.simple_tag def current_time(format_string): return datetime.datetime.now().strftime(format_string)
使用Library.simple_tag(takes_context=True)时,设置takes_context=True参数允许访问模板的当前环境上下文。这会将上下文中的参数和值以字典形式传递给函数中的一个名为context的参数。
@register.simple_tag(takes_context=True) def current_time(context, format_string): timezone = context['timezone'] return your_get_current_time_method(timezone, format_string)
当使用takes_context=True时,函数的第一个参数必须是context。同时,可以使用name参数对标签进行重命名。
二、内含标签(Inclusion tags)
这类标签允许渲染其他模板文件,并将渲染后的结果输出到当前页面。
Library.inclusion_tag()同样支持takes_context=True参数,其用法与Library.simple_tag()类似。
from django import template
register = template.Library()
@register.inclusion_tag('result.html')
def test():
a=['first','second','third']
return {'choices':a}
result.html模板内容如下:
<ul>
{% for choice in choices %}
<li> {{ choice }} </li>
{% endfor %}
</ul>
test.html模板内容如下:
{% load mytags %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% test %}
</body>
</html>
对应的View视图函数定义如下:
def test(request): return render(request,'test.html')
当访问http://127.0.0.1:8000/test/时,浏览器将显示渲染后的页面。
三、分配标签(Assignment tags)
分配标签与简单标签类似,但不会直接输出结果。它允许使用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>
以上即为Django中自定义标签和过滤器的完整实现流程,希望对您的学习有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









