【问题标题】:Django template filters, tags, simple_tags, and inclusion_tagsDjango模板过滤器、标签、simple_tags和inclusion_tags
【发布时间】:2011-08-01 00:02:35
【问题描述】:

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

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

这是我对区别的看法:

  • 模板过滤器:只对字符串进行操作并返回字符串。无法访问模型?
  • 模板标签:访问你可以在视图中访问的任何东西,编译成具有指定渲染函数的节点(似乎唯一的优点是你可以将变量添加到上下文中?)
  • simple_tags:接受字符串和模板变量并返回一个字符串,传递给你的是模板变量的值而不是变量本身(你什么时候希望变量本身超过值?)
  • 包含标签:允许您呈现任意额外的模板

谁能举例说明我何时想使用其中一个而不是另一个?

谢谢。

【问题讨论】:

    标签: python django


    【解决方案1】:

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

    # 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 个参数(并且您还可以访问模板上下文)。

    【讨论】:

    • 如果我理解得很好,filtersimple_tag 之间的区别在于您只能使用filter 传递2 个参数,而对于simple_tag,这个数字是无限的。如果是这样,为什么还要使用filter
    猜你喜欢
    • 2013-03-16
    • 1970-01-01
    • 2020-02-16
    • 2011-09-30
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    相关资源
    最近更新 更多