Django模板开发:深入解析filter与simple_tag的自定义实现与对比

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

本文详细讲解Django中如何利用filter和simple_tag自定义前端函数以处理复杂逻辑。通过对比两者在参数传递数量、装饰器用法及调用语法上的差异,提供了完整的代码示例。重点阐述了如何将后台函数转化为模板可用的验证方法,并给出了处理多参数传递的实用技巧,帮助开发者灵活扩展Django模板引擎功能。

前言

Django的模板引擎内置了通用的功能函数,能够在前端实现大部分常见的代码逻辑,例如if条件判断和ifequal值对比等。然而,这种通用性仅覆盖大多数常规场景,对于稍复杂的逻辑——比如判断一个返回值是否为合法数字类型——模板引擎本身并不直接支持。若此时不希望将此类逻辑移至后台视图代码中处理,开发者便可以通过自定义前端函数功能来解决这一需求。

Django提供了两种实现自定义模板功能的方式:filter和simple_tag。下文将对比这两种方式,并分别演示如何实现判断返回值的功能函数。

准备工作

1、应用程序必须已在settings配置文件中注册。

2、在应用目录下创建templatetags目录。

3、在templatetags目录下创建模块文件,并导入Django内部相关方法。

filter

在templatetags目录下创建Python模块,此处命名为app01_func.py,具体代码如下:

from django import template
from django.template.defaultfilters import stringfilter

register = template.Library()


@register.filter
def value_verification(value): # value为前端传递的参数
 try:
  int(value)
  return True
 except:
  return False

完成后台功能定制后,即可在模板文件中调用该函数。首先,需要在模板文件头部引入后台Python模块。

{% load app01_func %}

例如,当我们需要判断后台返回值load是否为一个有效数字时,可按如下方式进行调用:

{% if load|value_verification %}
 {{ load }} is a valid int number.
{% else %}
 {{ load }} is letter.
{% endif %}

simple_tag

simple_tag的代码编写方式与filter基本一致,主要区别在于装饰器部分需调用simple_tag方法。

from django import template
from django.template.defaultfilters import stringfilter

register = template.Library()


@register.simple # 这里修改为simple_tag
def value_verification(value): # value为前端传递的参数
 try:
  int(value)
  return True
 except:
  return False

同时,前端的调用方式也需相应调整为:

{% value_verification load %}

传递参数

- filter最多支持传递两个参数。

- simple_tag支持传递多个参数。

在filter中,可通过以下方式实现参数传递:

{{ load | value_verification:"100"}}

此处向后端传递了两个参数,分别是load和100,后端函数也需相应定义好形参:

def value_verification(value, custom): # 配置好形参
 ...

在simple_tag中可以指定多个形参,前台的调用方式如下:

{% value_verification load 100 200 ... %}

若filter中参数数量超过两个,且又不希望使用simple_tag,可将多个参数用特定字符拼接成一个字符串传递给后端,后端再通过split方法解析获取多个参数。

对比总结

通过simple_tag和filter可以完成模板引擎原生功能无法实现的某些操作。filter将指定函数转化为返回值可执行的方法,而simple_tag则将函数功能转化为标签功能(类似if、ifequal等)。两者的调用方式不同,具体对比如下:

{{ load | value_verification }} # filter
{% value_verification load %} # simple_tag

由于调用方式的差异,若返回值需作为if或ifequal的判断依据,则只能使用filter方法。stringfilter方法可将接收到的所有参数转换为字符串类型,引用方式与register装饰器相同,但需注意必须放置在register下方,否则无法生效。

总结

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如有疑问大家可以留言交流,谢谢大家对本站的支持。

相关标签:

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

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 算法库。