Python 如何在Jinja 2中使用第三方应用程序模板标签?

Python 如何在Jinja 2中使用第三方应用程序模板标签?,python,django,templates,django-templates,jinja2,Python,Django,Templates,Django Templates,Jinja2,我正在为我的Django网站尝试Jinja2 现在,由于Jinja2不是官方的Django模板引擎,它拒绝识别/加载我在Jjinja2之前使用的模板标记 现在,即使模板标签的创建需要更改,那么如何在第三方应用程序中反映呢 在这种情况下,似乎不可能使用Jinja2,因为系统必须按照Jinja2工作 (我还使用coffin作为Jinja Django的适配器)。Django的结构不允许交换模板引擎,因为它是系统的核心部分。即使您可以使用coffin,它也不是一种受支持的配置,也不能指望第三方模块支持

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

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

现在,即使模板标签的创建需要更改,那么如何在第三方应用程序中反映呢

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


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

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

如果您想使用jinja2,请使用一个设计有可插入模板引擎的框架,或者使用一个没有模板引擎的框架

列出了Jinja2附带的开箱即用集成。在该页面上,您可以看到
Pyramid
是受支持的,这是因为根据设计,Pyramid允许可插入组件


(由《金甲2》幕后的同一人制作)对《金甲2》有着本地的支持。

你可以用coffin来实现这一点。Coffin提供了一种在jinja2模板中注册django样式标记的方法:

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

register.tag('djangoTagIWantToUse', djangoTagIWantToUse)
根据需要,您必须将任何自定义django模板标记重写为自定义Jinja2扩展

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

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


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

为django设计的第三方应用程序将依赖django模板引擎。所以你是对的,期望第三方应用程序与不受支持的模板引擎兼容是不现实的。在这种情况下,我想每个人都会使用一些第三方应用程序来做一些事情。即使不多,但仍然-这使得在实际场景中不可能使用Jinja2。《棺材》(coffin)涵盖了所有要点,但它没有。那么,该行业是如何使用Jinja2的?@YugalJindle:谁说该行业将Jinja2与django一起使用?我很确定它在django以外的地方也有广泛的应用。您可能缺少的是django是一个框架。你不能期望一个框架有完全可交换的部分,从官方->第三方Django的结构不允许交换模板引擎;因为它是系统的核心部分。即使您可以使用
coffin
,它也不是受支持的配置;没有第三方模块可以支持它。如果您想使用jinja2,请使用一个用它设计的框架,如
flask
pyramid
。我理解。。你的观点,因为我更多的是在研究模式。如果是这样的话,那么您如何将Jinja2与django一起使用,因为我在模板引擎上遇到了性能问题。因此,您得出的结论是,除非您准备好让第三方的东西都按照
Jinja2
手动工作,否则就没有办法将
Jinja2
与django一起使用?+1作为一个明确的答案,我正在寻找一些人们在Django中使用
Jinja2
的例子。因为它在djangocon活动中被谈论了很多。这里值得一提的是,SO不是一个讨论论坛;如果你有具体的问题;你需要列举清楚。如果你正在寻找一个讨论你的一般惊奇或研究;那么这里不是这样的地方。我已经长大了,知道这一点,不用担心。一个问题有两种解决方案:
1
这是解决方案,或者
2
这无法解决,因为xyz。我非常理解你!可以在某些应用程序中使用jinja2模板,在其他应用程序中使用django模板-在同一个项目中,甚至可以在某些视图中使用django模板,在其他视图中使用jinja模板,这不是您通常想要的。看起来我们实际上可以在django中使用
jinja2
。你能再详细一点吗?它到底是怎么做的?不是真的,我不用棺材。但是如果你看他们的文档:它解释了如何做。coffin中的文档说“coffin可以自动使你现有的Django过滤器在Jinja中可用,但不能使你的自定义标记在Jinja中可用-你需要手动将它们重写为Jinja扩展。”你不能自动将Django模板标记转换为Jinja2模板标记。通常情况下,使用Jinja2可以避免使用模板标记,因为有宏。那么,为什么它可以让您注册这两种类型的标记呢?register.tag('foo',do_foo)#Django版本的tag register.tag(footension)#Jinja版本的tag如何将
i18
用于Jinja2,请提供
{%trans%}
{%blocktrans%}/code>备选方案/更改的示例代码。我几乎宣布
Jinja2
不可用,因为我们使用的是第三方应用程序-其代码不是由我们维护的。{%trans%}something{%endtrans%}在Jinja2中只有一个版本的trans标签。有文献记载,还有一种方法可以实现多元化。太好了。。我将探索更多的
jinja