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

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

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

  • 模板过滤器:仅对字符串和返回字符串进行操作.没有模特?
  • 模板标记:访问视图中可以访问的任何内容,通过指定的渲染函数编译成 node (看起来唯一的优势是可以向上下文中添加变量?)
  • 简单的_标签:获取字符串和模板变量并返回一个字符串,系统会向您传递模板变量的值,而不是变量本身(您什么时候希望变量本身超过该值?)
  • 包含标签:允许您呈现任意的额外模板

有没有人能举个例子,说明我什么时候想要使用其中一个而不是另一个?

谢谢你.

推荐答案

Template filters可以操作任何对象(一次最多操作两个对象).它们只是接受一个或两个参数的函数.例如:

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

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

它们受到限制,因为它们不能访问模板上下文,并且只能接受有限数量的参数.

Use case:您希望在打印之前稍微修改上下文中的一个变量.

可以改变解析模板的睡觉的方式,并且可以访问使用它们的上下文中的任何东西.他们非常强大.例如,我编写了一个模板标记,它子类{% extends %},并允许模板根据当前用户扩展不同的模板.

当使用模板标签时,您可以很容易地识别它们,因为它们围绕在{%%}周围.

Use case:您需要执行一些逻辑,这些逻辑需要Python代码和对模板上下文的访问.

Inclusion tags仍然是模板标记,但是Django提供了一些帮助器(即@inclusion_tag修饰器)来使编写这类模板标记变得很容易.

Use case:您希望将一个模板呈现为另一个模板.例如,您的网站上可能有一个广告,您希望在不同的地方使用该广告.可能无法使用模板继承来实现您想要的结果,因此您可以编写一个包含标记,而不是多次复制/粘贴广告的HTML.

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

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

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

Django相关问答推荐

如何在Django模板中为无效词典查找打开异常?

获取 Django (postgres) 中带注释字段的平均值

测试 - 两个类共享相同的登录代码,但它只能在一个类中工作

在Django上传JPEG图像时遇到问题

Django:获取每组最新的N条记录

Django rest框架:自定义对象权限不起作用

如何重命名标准 django-registration 模板的名称

更新或创建异步 Django ORM 实例

Django 应用程序似乎无法识别相关名称?

使用 Django 和 South 重命名应用程序

使用 Python / Django 的 Google API 示例的 Oauth

Django:访问给定字段的 Select 元组

在 django admin 中创建对象时如何自动插入当前用户?

Django ModelChoiceField optgroup 标签

django post_save 更新信号

在 django 中是否有生成 settings.SECRET_KEY 的功能?

在 docker 容器中创建 django 超级用户而不输入密码

Django 模型方法 - create_or_update

如何更改 django 模板中布尔值的打印方式?

如何在 django 模板中呈现有序字典?