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

2024-06-02 07:13:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

  • 模板过滤器:只对字符串和返回字符串进行操作。无法访问模型?
  • 模板标记:访问在视图中可以访问的任何内容,用指定的呈现函数编译成节点(似乎唯一的优势是可以向上下文添加变量?)
  • 简单标记:获取字符串和模板变量并返回字符串,传递给您的是模板变量的值,而不是变量本身(您何时希望变量本身超过值?)
  • 包含标记:允许您呈现任意额外模板

有人能举个例子来概括一下我什么时候想用其中的一个来代替另一个吗?

谢谢。


Tags: django字符串文档标记devcom模板http
1条回答
网友
1楼 · 发布于 2024-06-02 07:13:51

模板过滤器可以对任何对象进行操作(一次最多操作两个对象)。它们只是需要一两个参数的函数。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个参数。

相关问题 更多 >