【问题标题】:Interpolate Django template include variable插入 Django 模板包含变量
【发布时间】:2011-09-27 19:00:08
【问题描述】:

我正在做类似的事情

{% for part in parts %}
     {% include "inc.html" with o=part prefix="part{{ forloop.counter0 }}_" %}
{% endfor %}

inc.html 可能是这样的:

<p id="{{ prefix }}para">{{ o.text }}</p>

我刚刚发现前缀变量没有被插值,"part{{ forloop.counter0 }}_" 是按字面意思传递的。

任何相对优雅的解决方法?

【问题讨论】:

  • 为什么人们认为你可以在 inside 模板标签中使用可变语法?文档中没有任何建议。
  • 因为它如此自然!我的例子是如此愚蠢和愚蠢吗?这是一个真实的例子,我在其他两个地方使用了这个包含纯字符串前缀的地方,现在我需要在一个循环中使用它 - 没有理论,只是一个常规的期望

标签: django django-templates


【解决方案1】:

我认为最好的解决方案是注册一个包含标签,它可以处理 part 和 forloop.counter 操作:

@register.inclusion_tag("inc.html")
def inc_tag(part, loop_counter):
    prefix = 'part%s_' % (loop_counter,)
    context = {
        'part': part,
        'prefix': prefix,
    }
    return context

你会这样称呼它

{% for part in parts %}
    {% inc_tag part=part loop_counter=forloop.counter0 %}
{% endfor %}

你的方式也可以这样,但我不建议这样做

{% for part in parts %}
    {% with "part"|add:forloop.counter0|add:"_" as prefx %}
        {% include "inc.html" with o=part prefix=prefix %}
    {% endwith %}
{% endfor %}

【讨论】:

  • 您的第二个解决方案失败可能是因为“此过滤器将首先尝试将两个值强制转换为整数。如果失败,它将尝试将这些值加在一起。这将适用于某些数据类型(字符串,列表等)并在其他人上失败。如果失败,结果将是一个空字符串。现在要试验第一个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 2014-05-03
  • 2017-03-07
相关资源
最近更新 更多