【问题标题】:How to use 3rd party app templatetags with Jinja 2?如何在 Jinja2 中使用 3rd 方应用程序模板标签?
【发布时间】:2012-06-12 13:04:47
【问题描述】:

我正在为我的 Django 网站尝试 Jinja2。

现在,由于 Jinja2 不是官方的 Django 模板引擎,它拒绝识别/加载我在 Jjinja2 之前使用的模板标签。

现在,即使模板标签的创建必须发生变化,那么如何才能在 3rd 方应用程序中反映出来?

在这种情况下,似乎不可能使用 Jinja2,因为系统必须按照 Jinja2 工作。

(我也使用coffin 作为 Jinja-Django 的适配器)。

【问题讨论】:

  • 为 django 设计的第三方应用程序将依赖 django 模板引擎。所以你是对的,期望 3rd 方应用程序与不受支持的模板引擎兼容是不切实际的。
  • 在这种情况下,我想每个人都会使用一些 3rd 方应用程序。即使不多但仍然 - 在实际场景中使用 Jinja2 是不可能的。 coffin 是否涵盖了所有要点,但事实并非如此。那么这个行业是如何使用 Jinja2 的呢?
  • @YugalJindle:谁说业界正在使用 Jinja2 和 django?我很确定它在 django 之外广泛适用。您可能缺少的是 django 是一个框架。你不能指望一个框架有来自官方 -> 第三方的完全可交换的部分
  • Django 的结构不允许交换模板引擎;因为它是系统的核心部分。即使可以,使用coffin,它也不是受支持的配置;并且不能指望第三方模块支持它。如果您想使用 jinja2,请使用为其设计的框架,例如 flaskpyramid
  • 我明白.. 你的观点,因为我更多的是处于研究模式。如果是这种情况,那么您如何将 Jinja2 与 django 一起使用,因为我在模板引擎上遇到了性能问题。

标签: python django templates django-templates jinja2


【解决方案1】:

根据coffin docs,您必须将任何自定义 django 模板标签重写为自定义 Jinja2 扩展。

您还可以使用 jinja2 宏功能来模拟 Django 的模板标签。最显着的区别是,对于 Jinja2 宏,需要通过模板上下文提供所有上下文数据,而在 Django 标签中,您可以使用其他方式访问数据(例如从数据库加载或调用其他 Python 库)。

我使用 Jinja2 模板已经有一段时间了,从来不需要创建自定义模板标签。

可以在站点的一个应用程序中使用 django 模板,而在另一个应用程序中使用 jinja2,这不是问题,但是从 django 模板导入或扩展 jinja2 模板并不容易,反之亦然。

【讨论】:

  • 您如何将i18 与Jinja2 一起使用,请提供{% trans %}{% blocktrans %} 替代/更改的示例代码。我几乎宣布 Jinja2 不可用,因为我们使用的是第 3 方应用程序 - 其代码不是由我们维护的。
  • {% trans %}something{% endtrans %} Jinja2 只有一个版本的 trans 标签。它已记录在案,还有一种方法可以进行复数化。
  • 太棒了..我将探索更多jinja
【解决方案2】:

你可以用棺材做到这一点。 Coffin 提供了一种注册 django 样式标签以在 jinja2 模板中使用的方法:

from coffin import template
from ThrdPartyDjangoLib import djangoTagIWantToUse
register = template.Library()

register.tag('djangoTagIWantToUse', djangoTagIWantToUse)

【讨论】:

  • 看来我们实际上可以在 Django 中使用Jinja2。你能详细说明一下吗?它的实际作用和作用是什么?
  • 不是真的,我不使用棺材。但是,如果您查看他们的文档:github.com/coffin/coffin#custom-filters-and-extensions 它解释了如何做到这一点。
  • coffin 中的文档说“Coffin 可以自动使您现有的 Django 过滤器在 Jinja 中可用,但不是您的自定义标签 - 您需要手动将它们重写为 Jinja 扩展。”您不能自动将 Django 模板标签转换为 Jinja2 模板标签。通常,使用 Jinja2 可以避免使用模板标签,因为有宏。
  • 那为什么它给你一种注册BOTH类型标签的方法呢? register.tag('foo', do_foo) # Django 版本的标签 register.tag(FooExtension) # Jinja 版本的标签
【解决方案3】:

Django 的结构不允许交换模板引擎,因为它是系统的核心部分。即使您可以使用coffin,它也不是受支持的配置,也不能指望第三方模块支持它。这与要求第三方模块支持sqlalchemy 相同,因为您找到了让 django 使用它的方法。

如果您想使用 jinja2,请使用设计有可插入模板引擎的框架 - 或不带模板引擎的框架。

integration page 列出了 Jinja2 附带的开箱即用的集成。在该页面上,您可以看到支持Pyramid - 这是因为设计金字塔允许可插拔组件。

Flask(由 Jinja2 背后的同一个人制作)原生支持 Jinja2。

【讨论】:

  • 所以,您的结论是正确的,除非您准备好手动使第三方的东西按照jinja2 工作,否则无法将jinja2 与django 一起使用?
  • +1 以获得明确的答案,我正在寻找一些人们在 Django 中使用 Jinja2 的示例。因为它在 djangocon 活动中被谈论了很多。
  • 这里值得一提的是,SO 不是一个讨论论坛。如果您有具体问题;你需要清楚地列举它。如果您正在寻找关于您的一般疑问或研究的讨论;那么这不是那个地方。
  • 我在stackoverflow 上已经足够大了,知道这一点,不用担心。有2个问题的解决方案:1这是解决方案或2这无法解决,因为xyz。我非常了解stackoverflow!
  • 可以在某些应用程序中使用 jinja2 模板,而在其他应用程序中使用 django - 在同一个项目中,甚至可以在某些视图中使用 django 模板,而在其他视图中使用 jinja,这不是您通常的做法想要这样做。
猜你喜欢
  • 2011-09-17
  • 2011-06-15
  • 2014-07-30
  • 2014-04-24
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 2010-11-03
  • 2012-01-06
相关资源
最近更新 更多