Django自定义标签与过滤器开发指南

宋时安
宋时安
发布时间:2026-10-13| 2人浏览过
原创

本文详细讲解如何在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中自定义标签和过滤器的完整实现流程,希望对您的学习有所帮助。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。