【问题标题】:Any drawbacks or gotchas to using Jinja2 templates in Django?在 Django 中使用 Jinja2 模板有什么缺点或陷阱吗?
【发布时间】:2010-09-29 22:13:21
【问题描述】:

阅读 Jinja2 文档后,我有兴趣在未来的 Django 项目中使用它。但是,我想知道在 Django 中使用 Jinja2 模板时是否有人遇到过任何缺点或陷阱?如果是这样,您是如何解决这些问题的?

我也不介意听到积极的体验,只是为了更好地了解 Jinja2 的最佳和最差。

【问题讨论】:

    标签: django templates frameworks django-templates jinja2


    【解决方案1】:

    我在我的一些项目中使用 Jinja2,并且喜欢它赋予我的额外表现力。我可以将我的表示逻辑和应用程序逻辑分开,但我不必向后弯腰来调用我专门为我的表示层设计的函数/方法。

    除了其他海报已经列出的内容之外,还有一些我发现的内容:

    • Admin 应用与 Django 模板紧密耦合
    • Auth 应用程序(和其他地方)附带的默认视图和装饰器与 Django 模板耦合,因此如果您想使用 Jinja2 模板进行登录/注销/等,您可能需要重复这些工作

    默认情况下,Django 模板会转义其输出,而 Jinja2 不会。我认为这两种方法都有其优点,但如果您在两者之间切换,则必须牢记这一点。

    【讨论】:

    • 但是,需要明确的是,Jinja 2 中默认的 HTML 转义只是一个配置选项。
    【解决方案2】:

    【讨论】:

    • Django 1.4 现在可以做{% if foo == 'bar' %}
    【解决方案3】:

    我还没有将 Jinja2 与实际的 Django 站点一起使用,但我确实将在独立模式下使用 Django 模板的应用程序转换为 Jinja2 模板。我遇到的唯一(非常小的)问题是缺少 {% spaceless %} 模板标签。

    【讨论】:

    • 一件事我还没有探索过Jinja的扩展;它们与 Django 中用户定义的模板标签相比如何?
    • 如果您还没有看过 Armin 的文章 lucumr.pocoo.org/2008/9/16/…,您应该阅读它。在顶部,他有一个项目的链接来转换 django->jinja2。它不能做自定义标签,所以我想它们都需要重写。
    • 对于这个问题的未来访问者:github.com/cdleary/coffin/tree/master 是一个不错的应用程序,自称是 Django 的 Jinja 适配器。
    • 对于任何人来说,Jinja2 实际上都内置了这个功能作为其模板标签语法的一部分:jinja.pocoo.org/docs/templates/#whitespace-control
    • 您应该编辑您的答案以反映 Jinja2 的标签中内置了空白控制这一事实。
    【解决方案4】:

    扩展 Jinja2 比 Django 模板系统困难得多(我说的是模板标签)。虽然大部分包含标签功能都可以在 Jinja 中使用宏来实现(它们甚至似乎更合适),但在 Jinja 中编写更复杂的标签确实很难(请参阅 the docs 自己)。

    除此之外,唯一的障碍是基于 Django 的习惯... ;)

    【讨论】:

      【解决方案5】:

      在 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 暴露给模板的大部分内容(尤其是 cmets 框架)都暴露在自定义标签中,这些标签不会转换为 Jinja2。遗憾的是,向后兼容性问题不会很快改变。

      【讨论】:

        【解决方案6】:

        对我来说,在 Django 中使用 Jinja2 最烦人的事情是 当某些 Django 应用程序带有自己的模板或模板标签(例如 django-uni)时,您将无法使用它们 -表格)。

        这有时会令人沮丧,当您找到一个很好的应用程序可以解决您的问题但由于它与 Jinja2 不兼容而无法使用时。

        顺便说一句,Armin Ronacher(Jinja2 的作者)似乎正在开发一个新的模板引擎后端,该后端将位于 Jinja2 和 Django 之后,替换当前的基础架构,但保留向后兼容性。 https://www.djangoproject.com/weblog/2011/apr/25/gsoc/

        【讨论】:

          【解决方案7】:

          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')
          

          【讨论】:

            【解决方案8】:

            截至 2015 年 4 月,Django 1.8 支持在同一项目中使用 multiple engines 呈现模板,并具有 built-in support for Jinja2。所以它不再是一个全有或全无的决定。

            (虽然这不是直接回答问题,因为以前就是这种情况,我认为它值得不仅仅是评论)。

            【讨论】:

            • 呃,等等。我赞成认为您提供的链接将解释我如何在同一个项目中同时使用 DJango 和 Jinja2。它只是 Jinja2 模板后端文档的链接。这有什么帮助?
            • 这会是一个更好的链接 - stackoverflow.com/questions/29420094/…
            • 我现在为多引擎支持添加了一个链接/引用。现有链接显示内置 Jinja2 支持。
            【解决方案9】:

            我在使用 Jinja2 时遇到了一些问题。不过,有一个非常简单的方法可以解决这个问题。

            django crispy forms with jinja2

            我认为总的来说,缺点很可能是与 Jinja2 不兼容的常用 Django 包

            【讨论】:

              猜你喜欢
              • 2011-06-28
              • 2011-03-18
              • 1970-01-01
              • 1970-01-01
              • 2010-11-27
              • 2011-02-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多