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

时间:2011-04-07 19:51:35

标签: python django

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

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

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

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

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

感谢。

1 个答案:

答案 0 :(得分:46)

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

# 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个参数。