阅读 Jinja2 文档后,我有兴趣在未来的 Django 项目中使用它。但是,我想知道在 Django 中使用 Jinja2 模板时是否有人遇到过任何缺点或陷阱?如果是这样,您是如何解决这些问题的?
我也不介意听到积极的经历,只是为了更好地了解 Jinja2 的最佳和最差。
阅读 Jinja2 文档后,我有兴趣在未来的 Django 项目中使用它。但是,我想知道在 Django 中使用 Jinja2 模板时是否有人遇到过任何缺点或陷阱?如果是这样,您是如何解决这些问题的?
我也不介意听到积极的经历,只是为了更好地了解 Jinja2 的最佳和最差。
我在我的一些项目中使用 Jinja2,并且喜欢它给我的额外表现力。我可以将我的表示逻辑和应用程序逻辑分开,但我不必向后弯腰来调用我专门为我的表示层设计的函数/方法。
除了其他海报已经列出的内容之外,以下是我发现的一些内容:
在行为上,Django 模板默认会转义其输出,而 Jinja2 不会。我认为这两种方法都有其优点,但如果您在两者之间切换,则必须牢记这一点。
我还没有将 Jinja2 与实际的 Django 站点一起使用,但我确实将在独立模式下使用 Django 模板的应用程序转换为 Jinja2 模板。我遇到的唯一(非常小的)问题是缺少 {% spaceless %} 模板标签。
扩展 Jinja2 比 Django 模板系统困难得多(我说的是模板标签)。虽然大部分包含标签功能都可以在 Jinja 中使用宏来实现(它们甚至看起来更合适),但在 Jinja 中编写更复杂的标签确实很难(请参阅文档)。
除此之外,唯一的障碍是基于 Django 的习惯...... ;)
在 Django 主干中添加了一些新代码,可让您编写可用于使用不同模板语言的 TemplateLoaders 和 Template 类。文档已在http://docs.djangoproject.com/en/dev/ref/templates/api/#using-an-alternative-template-language添加,它将在1.2 版本中。这应该可以消除大多数问题,例如使用自定义模板进行登录、注销、管理等。
另一种解决方案是在 Django 之上使用一个层,例如 Chouwa 或 Djinja2。让 Django 的内置视图使用您的模板时会遇到问题,但如果您不想使用 Django 主干,它可以工作。
一旦你完成了其中任何一个,唯一真正主要的问题是 Django 暴露给模板的大部分内容(尤其是评论框架)都暴露在自定义标签中,这些标签不会转换为 Jinja2。遗憾的是,向后兼容性问题不会很快改变。
对我来说,在 Django 中使用 Jinja2 最烦人的事情是,当某些 Django 应用程序带有自己的模板或模板标签(例如 django-uni-forms)时,您将无法使用它们。
有时这可能会令人沮丧,当您找到一个可以解决您的问题但您无法使用它的出色应用程序时,因为它与 Jinja2 不兼容。
顺便说一句, Armin Ronacher (Jinja2 的作者)似乎正在开发一个新的模板引擎后端,该后端将位于 Jinja2 和 Django 之后,替换当前的基础架构,但保留向后兼容性。https://www.djangoproject.com/weblog/2011/apr/25/gsoc/
回复:在 jinja2中缺少{% spaceless %}
,查看jinja2htmlcompress模块:
# In shell:
fetch -o myapp/jinja2htmlcompress.py https://raw.github.com/mitsuhiko/jinja2-htmlcompress/master/jinja2htmlcompress.py
# In your app:
app = Flask(__name__, static_path='/static')
app.config.from_object('myapp.default_settings')
app.jinja_env.add_extension('myapp.jinja2htmlcompress.HTMLCompress')
截至 2015 年 4 月,Django 1.8 支持在同一个项目中使用多个引擎渲染模板,并内置了对 Jinja2 的支持。所以它不再是一个全有或全无的决定。
(虽然这不是直接回答这个问题,因为以前就是这种情况,我认为它值得不仅仅是评论)。
我在使用 Jinja2 时遇到了一些问题。然而,有一个非常简单的方法可以解决这个问题。
我认为总的来说,缺点很可能是类似的经常使用的 Django 包,它们只是不与 Jinja2 一起玩