2011-09-27 133 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