我正在尝试使用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中是否有另一种惯用的方式来实现这一目标?
答案 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 %}