2011-09-27 55 views
3

我做这样的事情插值Django的模板包括可变

{% 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 }}_"是从字面上通过。

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

+0

为什么人们认为你可以使用变量synta x *内*模板标签?文档中没有任何建议。 –

+3

,因为它**会是如此自然!我的例子是如此愚蠢和愚蠢?这是一个真实世界的例子,我在其他两个地方使用这个包含纯字符串前缀,现在我需要它在一个循环内 - 没有理论,只是一个正常的期望 – Guard

回答

3

我认为最好的解决办法是注册一个使用inclusion_tag,将处理部分和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 %} 
+0

你的第二个解决方案失败可能是因为“此过滤器将首先尝试将这两个值强制转换为整数,如果失败,它会尝试将值加在一起,这对一些数据类型(字符串,列表等)有效,对另一些数据类型失败,如果失败,结果将会是一个空的字符串“。现在去试试第一个吧 – Guard

+0

非常好,第一个很好,谢谢! – Guard