阅读Jinja2文档后,我有兴趣在将来的Django项目中使用它。但是,我想知道是否有人在使用Django的Jinja2模板时遇到任何缺点或陷阱?如果是这样,你是如何解决它们的?
我也不介意听到积极的经历,只是为了获得Jinja2最好和最差的好横截面。
答案 0 :(得分:13)
我在一些项目中使用Jinja2,并且喜欢它给我的额外表现力。我可以将我的表示逻辑和应用程序逻辑分开,但我不必向后弯腰调用我专门为我的表示层设计的函数/方法。
除了其他海报已经列出的内容之外,以下是我发现的一些内容:
行为方面,Django模板默认会逃避输出,而Jinja2则不会。我认为这两种方法都有其自身的优点,但如果你在两者之间切换,你必须牢记这一点。
答案 1 :(得分:5)
我还没有将Jinja2用于实际的Django网站,但我确实在独立模式下使用Django模板将应用程序转换为Jinja2模板。我遇到的唯一(非常小的)问题是缺少{%spaceless%}模板标记。
答案 2 :(得分:5)
答案 3 :(得分:3)
扩展Jinja2比Django模板系统要困难得多(我说的是模板标签)。虽然大多数包含标签功能都可以使用Jinja中的宏来实现(它们甚至看起来更合适),但在Jinja中编写更复杂的标签非常困难(请亲自查看the docs)。
除此之外,唯一的障碍是基于Django的习惯......;)
答案 4 :(得分:2)
在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。遗憾的是,向后兼容性问题不会很快发生这种变化。
答案 5 :(得分:1)
对我来说,在Django中使用Jinja2最烦人的事情是当他们带有自己的模板或模板标签时,你将无法使用某些Django应用(例如django-uni -forms)。
这有点令人沮丧,当你发现一个很棒的应用可以解决你的问题,但你不能使用它,因为它与Jinja2不兼容。
顺便说一下,似乎Armin Ronacher(Jinja2的作者)将开发一个新的模板引擎后端,它将支持Jinja2和Django,取代当前的基础设施但保留了向后兼容性。 https://www.djangoproject.com/weblog/2011/apr/25/gsoc/答案 6 :(得分:1)
re: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')
答案 7 :(得分:1)
截至2015年4月, Django 1.8支持在同一个项目中使用multiple engines呈现模板,并且built-in support for Jinja2。所以它不再是一个全有或全无的决定。
(虽然这不是直接回答这个问题,因为之前我认为这不仅仅是一个评论,而且还不仅仅是评论。)
答案 8 :(得分:0)
我在使用Jinja2时遇到了一些问题。然而,有一种非常简单的方法可以解决这个问题。
django crispy forms with jinja2
我认为总的来说下行很可能是类似于经常使用的Django套餐,只是不玩Jinja2