Django 模板过滤器、标签、简单标签和包含标签

45 投票
1 回答
10856 浏览
提问于 2025-04-16 15:18

这是一个关于Django中四种不同标签之间区别的一般性问题。我刚刚阅读了关于模板标签的文档页面:http://docs.djangoproject.com/en/dev/howto/custom-template-tags/

但我发现很难判断在什么情况下应该使用某一种标签而不是另一种。例如,模板标签能做的事情,简单标签就不能做吗?过滤器是否仅限于处理字符串,这也是文档说模板标签更强大的原因,因为它们可以“做任何事情”吗?

以下是我对这些区别的理解:

  • 模板过滤器:只对字符串进行操作,并返回字符串。不能访问模型吗?
  • 模板标签:可以访问视图中可以访问的任何内容,编译成节点并指定渲染函数(似乎唯一的好处是可以向上下文中添加变量?)
  • 简单标签:接受字符串和模板变量,并返回一个字符串,你得到的是模板变量的值,而不是变量本身(什么时候你会想要变量本身而不是它的值呢?)
  • 包含标签:允许你渲染任意额外的模板

有人能给个例子说明在什么情况下我会选择使用其中一种而不是另一种吗?

谢谢。

1 个回答

72

模板过滤器可以对任何对象进行操作(最多同时处理两个)。它们其实就是一些函数,接受一到两个参数。例如:

# filter implementation
@filter
def myfilter(arg1, arg2):
    ....

# usage in template
{{ arg1|myfilter:arg2 }}

不过,它们有个限制,就是不能访问模板上下文,只能接受有限数量的参数。

使用场景:你想在打印某个变量之前,稍微修改一下它的值。

模板标签可以改变模板的解析方式,并且可以访问使用它们时的上下文。它们非常强大。例如,我写了一个模板标签,它是{% extends %}的子类,允许根据当前用户扩展不同的模板。

你可以很容易识别模板标签,因为它们是用{%%}包围起来的。

使用场景:你想执行一些需要Python代码和访问模板上下文的逻辑。

包含标签仍然是模板标签,但Django提供了一些辅助工具(比如@inclusion_tag装饰器),让编写这种类型的模板标签变得简单。

使用场景:你想把一个模板渲染到另一个模板中。例如,你可能在网站上有一个广告,想在不同地方使用它。可能无法通过模板继承来实现你的需求,所以与其多次复制粘贴广告的HTML,不如写一个包含标签。

使用包含标签而不是现有的{% include %}模板标签的原因是,你可能想用不同的上下文来渲染模板。也许你需要进行一些数据库查询,以选择正确的广告进行展示。这在{% include %}中是做不到的。

简单标签类似于包含标签,简单标签也是模板标签,但功能有限,写法也比较简单。它们允许你编写一个可以接受任意数量参数的模板标签(例如{% mytag "some str" arg2 arg3 %}等),并且只需要实现一个可以接受这些参数的函数(可选地还可以接受一个context变量,以便访问模板上下文)。

简单标签本质上是对模板过滤器的升级,因为它们不仅可以接受1或2个参数,还可以接受任意数量的参数(并且你也可以访问模板上下文)。

撰写回答