【问题标题】:Alternative to blocktrans tag with long `with` clause使用长 `with` 子句替代 blocktrans 标记
【发布时间】:2019-01-15 14:35:03
【问题描述】:

上下文

我正在尝试使用 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 上相当冗长的讨论)。

问题

由于我在上述讨论中没有找到解决方案,我正在寻找一种方法来获得与我的第一个代码中相同的结果,而不会因为过长的行/大块 with 而妨碍我的模板可读性标签。

我曾考虑将该代码放在其他地方,例如 training 所基于的模型中的 @property 方法。但在我看来,该逻辑属于模板,(它不太可能在其他任何地方使用)。

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

【问题讨论】:

  • 也许这就是解决方案?我不确定它是否有效...{% blocktrans trimmed with t=training %} Training {{ t.type }} "{{ t.title }}" at {{ t.city }} {% endblocktrans %}
  • 很遗憾它不起作用^.

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


【解决方案1】:

一种方法是创建一个自定义模板标签来设置模板内的变量

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 %}

这也支持过滤器,例如

{% setvar training.title|title as title %}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-06
    • 2018-08-22
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 2011-07-21
    • 1970-01-01
    相关资源
    最近更新 更多