Django模板过滤器,标签,simple_tags和inclusion_tags

Eri*_*ner 30 python django

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

但我发现很难知道何时应该使用另一种变体.例如,模板标签可以做什么,simple_tag不能?过滤器仅限于操作字符串,这就是为什么文档说模板标签更强大,因为它们可以"做任何事情"?

以下是我对这些区别的看法:

  • 模板过滤器:仅对字符串和返回字符串进行操作.无法访问模型?
  • 模板标签:访问您可以在视图中访问的任何内容,编译成具有指定渲染功能的节点(似乎唯一的优点是您可以向上下文添加变量?)
  • simple_tags:获取字符串和模板变量并返回一个字符串,传递模板变量的值而不是变量本身(你何时想要变量本身超过值?)
  • 包含标签:允许您呈现任意额外模板

当我想要使用其中一个而不是另一个时,有人能举例说明吗?

谢谢.

bra*_*ers 49

模板过滤器可以对任何对象进行操作(最多两次一次).它们只是带有一个或两个参数的函数.例如

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

# usage in template
{{ arg1|myfilter:arg2 }}
Run Code Online (Sandbox Code Playgroud)

它们的局限性在于它们无法访问模板上下文,并且只能接受有限数量的参数.

使用案例:您希望在打印之前稍微修改上下文中的一个变量.

模板标签可以更改解析模板其余部分的方式,并且可以访问使用它们的上下文中的任何内容.他们非常强大.例如,我编写了一个模板标签,该标签用于子类{% extends %}并允许模板根据当前用户扩展不同的模板.

您可以在使用模板标签时轻松识别模板标签,因为它们周围环绕着{%%}.

使用案例:您希望执行一些需要Python代码和访问模板上下文的逻辑.

包含标签仍然是模板标签,但Django提供了一些帮助器(即@inclusion_tag装饰器),以便于编写此类模板标签.

使用案例:您想要将一个模板渲染到另一个模板中.例如,您的网站上可能有广告要在不同的地方使用.可能无法使用模板继承来实现您想要的功能,因此您可以编写包含标记,而不是多次复制/粘贴广告的HTML.

您在现有{% include %}模板标签上使用包含标签的原因是您可能希望使用与您所在模板不同的上下文来呈现模板.也许您需要执行一些数据库查询,以选择正确的广告到显示.这是不可能的{% include %}.

简单标签(如包含标签),简单标签仍然是模板标签,但它们功能有限,并且以简化的方式编写.它们允许您编写一个接受任意数量参数的模板标记(例如{% mytag "some str" arg2 arg3 %}etc),并要求您只实现一个可以接受这些参数的函数(以及可选的context变量,以便您访问模板上下文).

从本质上讲,它们是模板过滤器的升级,因为您可以接受任意数量的(或者您也可以访问模板上下文),而不是只接受1或2个参数.

  • 如果我很了解,`filter`和`simple_tag`之间的区别是只能使用`filter`传递2个参数,而对于'simple_tag`来说这个数字是无限的。如果是这样,为什么还要使用`filter`? (2认同)