【问题标题】:Jinja2 templates a superset of Django templates?Jinja2 模板是 Django 模板的超集?
【发布时间】:2014-08-05 20:48:05
【问题描述】:
根据the project documentation,Jinja2 模板是“在 Django 模板之后建模的 [sic]。”我在别处读到 Django 模板可以与 Jinja2 互换使用。
所以,我想标题已经说明了一切:Jinja2 模板是 Django 原生模板的(严格)超集吗?
否则,它们有何不同?如果差异很小,为什么 Jinja2 不是 Django 原生模板的超集?
【问题讨论】:
标签:
django
django-templates
jinja2
【解决方案1】:
不,Jinja 不是 Django 模板语言的严格超集。 Jinja documentation 中给出了一个很好的差异总结。
Jinja 成为 DTL 的超集并没有什么特别的原因。它是一个独立的包,可以被任何 Python Web 框架使用。我想说大部分差异是由于 Jinja 试图比 DTL 限制更少,更 Pythonic。例如,虽然 Jinja 过滤器语法使用通常的函数调用括号,但 DTL 使用 | 和 : 的组合。 (随着时间的推移,DTL 慢慢地发生了变化,并且比以前更加 Pythonic 了。)
Jinja 得到了 Django 的官方支持,甚至在此之前就有第三方包允许你使用它。唯一真正的兼容性问题是您不能在 Jinja 模板中使用 Django 的 custom template tags。如果您使用 Jinja 作为模板语言,但想使用第三方包,该包提供了自定义模板标签的功能,则可能会出现这种情况。
【解决方案2】:
Django 到 Jinja2 模板在方法调用、条件、过滤参数和测试方面略有不同
大多数语法元素的外观和工作方式都相同。
Django 模板中的示例:
{% for page in user.get_created_pages %}<br/>
<br/>
{% endfor %}
在 Jinja 会是这样:
{% for page in user.get_created_pages() %}<br/>
<br/>
{% endfor %}