带有long`with`子句的blocktrans标记的替代方法

时间:2018-08-08 10:48:58

标签: django django-templates internationalization readability django-context

上下文

我正在尝试使用django模板引擎使用上下文中的变量来呈现页面的可翻译部分。具体来说,这是我的用例

{% blocktrans trimmed with type=training.type title=training.title city=training.city %}
Training {{ type }} "{{ title }}" at {{ city }}
{% endblocktrans %}

这很好,但是,我的问题是blocktrans的长度非常快地超过可接受的长度(至少对我而言)。

我可以替代

    {% with training.title as title %}
    {% with training.type as type %}
    {% with training.city as city %}
    {% blocktrans trimmed %}
    Training {{ type }} "{{ title }}" at {{ city }}
    {% endblocktrans %}
    {% endwith %}
    {% endwith %}
    {% endwith %}

或使用一个单独的with子句。

但这并不能真正降低代码的可读性,尤其是在有更多变量要暴露给翻译字符串的情况下。

我想到的解决方案

我最初的想法是将blocktrans标记扩展到几行:

{% blocktrans trimmed with 
    type=training.type
    title=training.title
    city=training.city %}
Training {{ type }} "{{ title }}" at {{ city }}
{% endblocktrans %} 

不幸的是,django在模板中不支持多行标签。

(有关原因,请参见对django mailing list的冗长讨论)。

问题

由于我在上述讨论中没有找到解决方案,因此我在寻找一种方法来获得与第一个代码相同的结果,而又不会因{/ {1 }}标签。

我考虑过将代码放在其他地方,例如模型with中的@property方法所基于的。但是在我看来,那个逻辑属于模板(它不太可能会在其他地方使用)。

在django中是否有另一种惯用的方式来实现这一目标?

1 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是创建一个自定义模板标签,用于在模板内部设置变量

@Html.RenderAction("Sumthem", "Records")

和在模板中

from django import template

register = template.Library()

@register.simple_tag
def setvar(val):
    return val

这也支持过滤器,例如

{% load setvar %}
{% setvar training.title as title %}
{% setvar training.type as type %}
{% setvar training.city as city %}
{% blocktrans trimmed %}
    Training {{ type }} "{{ title }}" at {{ city }}
{% endblocktrans %}