【问题标题】:Django: Switching to Jinja2?Django:切换到 Jinja2?
【发布时间】:2011-05-19 05:07:24
【问题描述】:

我有几个小的(500 或 600 行模板代码)Django 站点,我想将它们迁移到使用 Jinja2... 但我想知道它需要做多少工作.那么,一般来说,将一个小型 Django 站点迁移到 Jinja2 需要多少工作量?它“值得”吗?

【问题讨论】:

  • 某事是否“值得”取决于您的标准。你想达到什么目的? Jinja2 允许您做哪些 Django 模板不允许做的事情?
  • 大多数情况下,我想要更简单的调试(该死,Django,你为什么忽略未定义的变量?!),更简单的模板标签,在模板中包含更多代码的能力(例如,Python 语法用于基本列表和数学运算),通常它看起来像是一种“设计更好”的语言。
  • 不足以成为答案,但对我来说这是值得的。我感到受到 Django 对模板中逻辑的限制的严重限制(应该有多少限制是一场圣战,但在 我的意见 中它太多了——从你的 cmets 来看,你是这么认为的也)。切换到 Jinja2 让我保持了基本相同的语法(清理了一些笨重的东西),我喜欢这种语法,并且由于附加的功能感觉像是升级了。我也喜欢模板引擎完全独立于我碰巧使用的任何框架的想法。
  • (该死,Django,你为什么忽略未定义的变量?!) - 提示:pycharm 1.5 支持模板调试,这意味着你可以在模板中附加断点。
  • 我用过django-jinja,效果很好。要了解从 django 模板更改为 jinja 会发生什么,请查看 differences page。不幸的是,即使在 3.1.1 的 PyCharm 设置中将 Jinja2 设置为默认 Python Template Language 后,我也无法使用 PyCharm 在 jinja2 文件中设置任何断点。我仍然认为这是值得的。

标签: django django-templates jinja2


【解决方案1】:

还有 django-jinja。 https://github.com/niwibe/django-jinja

新的好项目。 http://niwinz.github.io/django-jinja/latest/

它声称是与 Django 的简单且无阻碍的 jinja2 集成。

【讨论】:

    【解决方案2】:

    根据您的说法,迁移到 Jinja2 可能不值得。 Django 模板中有过滤器可以帮助您进行任何数学运算。

    关于列表操作,你到底在说什么?如果您希望模板中支持某些特定的列表操作,请编写custom filter

    还有一些现有的第三者math filters for Django

    如果你仔细想想,Django 模板中没有太多“编程结构”是设计使然。 HTML 模板应该是这样的……

    【讨论】:

    • 我同意模板不应该有“太多”的编程......我只是觉得Jinja 2的功能更实用一些。同样的处理,例如,列表操作:我可以写一个模板标签或其他东西,但我觉得如果我可以使用它会更实用,例如,{% for x in ['a', 'b'] %}...{% endfor %}
    【解决方案3】:

    虽然这只是我自己的经验,但我发现从 Django 转换到 Jinja2 是值得的,原因如下:

    1. 作为软件开发人员和模板设计师,Jinja2 的设计和实现对我来说似乎更直观;
    2. Jinja2 更具可扩展性(至少在我试图扩展模板引擎的方式上);
    3. Jinja2 在允许运行逻辑代码方面更加灵活(但它为您提供了足够的绳索来吊死自己);
    4. Jinja2 被认为明显更快(虽然我没有做过任何基准测试,但这总是会根据所使用的测试进行辩论,并且无论如何与必须执行 DB 的查询的总等待时间基本无关查找);
    5. Jinja2 提供比 Django 更有用的错误输出(即跟踪模板中发生错误的行号)。 编辑:根据 Dor 的评论,Django 提供了有用的错误指向问题所在行和上下文的消息,很像 Jinja2。

    如果您在使用 Django 的模板引擎时没有遇到任何问题,那么 Jinja2 应该会感觉相对直观,如果可能更精致一些(或者至少对我来说确实如此)。同样,我发现Coffin 项目写得很好,在从 Django 转换到 Jinja2 时很有帮助——既可以使用它,也可以作为如何扩展 Jinja2 的示例。

    话虽如此,Django 的模板引擎是可靠的,并且能够胜任大多数任务。我相信它会在 Django 的下一个版本中得到改进,并且有很多专门的开发人员付出了很多努力来增加它的功能。因此,无需担心它在近期到中期的未来会不受支持。

    再说一次,这只是我的经验,值得一提的是——我希望这会有所帮助。

    【讨论】:

    • Django 确实在模板代码中显示了错误的行(和周围的行)。
    • @Dor:现在可能是这样,但在我写答案的时候还不是。会修复。 :)
    • @Dor 哪个版本? 1.4 肯定没有(截至昨天)。
    • 刚刚用来自 SVN 的 Django 进行了测试,虽然我确信 1.4 也有这个功能。将 endfor 标记更改为 endfr,得到了这个异常:Invalid block tag: 'endfr', expected 'endfor',此行进一步向下:In template C:\...\templates\browser\item_list.html, error at line 187。还显示了有问题的行周围的模板代码。
    • 关于#4,我看到人们说这是不言而喻的,但情况并非总是如此。我有一个当前的 Django 1.6 站点,其数据库查找比模板渲染时间小一个数量级。使用 Django 调试工具栏之类的工具,并自行决定 Jinja 迁移是否有意义。
    【解决方案4】:

    两个项目试图通过简单的集成步骤将 Jinja 集成到 Django 中,并很好地与 Django 挂钩 -

    1. Coffin
    2. Chouwa

    我会立即将它们集成以试验它们是否也可以与 Django Admin 等 Django contrib 应用程序一起使用。但我觉得,它将可用于项目应用程序,Django 默认模板系统将用于 Admin 等内部应用程序。

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 2018-03-11
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      相关资源
      最近更新 更多