【问题标题】:How do I DRY up common text in a Django template?如何干燥 Django 模板中的常用文本?
【发布时间】:2009-10-19 20:54:28
【问题描述】:

我有一些静态文本需要显示在模板中的 2 个位置。

例如:

<div>
{% if something %}
    This is a static text
{% else %}
    Something else happened
{% endif %}
</div>
... more html
<span>
{% if something %}
    This is a static text
{% else %}
    Something else happend
{% endif %}
</span>
  1. 我可以通过在模板文件中的 2 个不同位置复制上述文本来完成上述操作(如上所示)。
  2. 我还可以创建一个模型来存储文本(这是 DRY,但需要调用数据库来完成一个简单的任务)
  3. 我正在考虑使用 include template,但这可能不是实现目标的最佳方式。

最好的方法是什么?

【问题讨论】:

  • 使用include 两次看起来不错。

标签: django django-templates


【解决方案1】:

一定要使用包含标签:

http://docs.djangoproject.com/en/dev/howto/custom-template-tags/#inclusion-tags

标签文件可以是超级简单的东西,比如“这是一个静态文本”或者整个块:

{% if something %}
This is a static text
{% else %}
Something else happened
{% endif %}

“something”可以作为变量传递给模板标签,这样你就可以以可变的方式使用整个块。

【讨论】:

  • 很高兴我发现了这一点;它似乎很有用。但我想弄清楚是为了什么。似乎标准的{% include %} 标签适用于我能想到的所有情况。有什么例子吗?
【解决方案2】:

我使用django internationalization 来做到这一点。所以在我的应用程序/模板中我只写了密钥,在 .po 文件中是密钥的值。

{% load i18n %}

<div>
{% if something %}
    {% trans "static" %}
{% else %}
    {% trans "something else" %}
{% endif %}
</div>

在我的 .po 文件中:

msgid "static"
msgstr "This is a static text"

msgid "something else"
msgstr "Something else happened

除了对多语言有用之外,文案写作更容易,以防您将来想更改它,因为您可以只查看一个文件而不是浏览多个模板。

【讨论】:

    【解决方案3】:

    有多种方法,但可能取决于文本是什么以及使用频率。如果没有完整的细节,很难推荐一个具体的选择

    1. 创建一个custom template tag(根据您在上面描述问题的方式,这个最有意义)。
    2. 创建一个基本模板,其中包含正确位置的文本,然后为您的“2 个位置”继承它
    3. 将静态文本放入设置文件中,并通过 Context 将其传递给模板渲染器(可能不是最好的主意,但可能会根据您的操作而定)

    【讨论】:

      【解决方案4】:

      您可以使用平面块:http://github.com/zerok/django-flatblocks

      或块:http://code.google.com/p/django-chunks/

      这些对于您的问题可能是多余的,因为它们将您的 sn-ps 存储在数据库中,但它们增加了可以通过管理员编辑它们的好处。

      {% load chunks %}
      <div>
      {% if something %}
          {% chunk "something" %} 
      {% else %}
          {% chunk "something_else" %}
      {% endif %}
      </div>
      

      有很多fork或类似的项目,例如:

      【讨论】:

        【解决方案5】:

        我有一个类似 Java 属性的文件,用于所有资源字符串。我只是提供我想要的。将这些内容保存在一个地方也使翻译变得容易。

        例如:

        welcome_msg="hello user!" 
        thank_you="thank you" 
        goodbye_msg="goodbye, " + thank_you
        

        【讨论】:

          【解决方案6】:

          如果包含的文本变大,请使用“包含”标签。

          {% include "myapp/helptext.html" %}

          GrtzG

          【讨论】:

            猜你喜欢
            • 2014-08-03
            • 2016-11-04
            • 1970-01-01
            • 2016-05-07
            • 2014-05-08
            • 1970-01-01
            • 2014-12-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多