我已经尝试连接这样:
{% for choice in choice_dict %}
{% if choice =='2' %}
{% with "mod"|add:forloop.counter|add:".html" as template %}
{% include template %}
{% endwith %}
{% endif %}
{% endfor %}
但出于某种原因我只得到“mod.html”而不是forloop.counter号码。有没有人知道发生了什么以及我可以做些什么来解决这个问题?非常感谢!
答案 0 :(得分:45)
你的问题是forloop.counter是一个整数,并且你正在使用add
模板过滤器,如果你把它传递给所有字符串或所有整数而不是混合,它将表现正常。
解决此问题的一种方法是:
{% for x in some_list %}
{% with y=forloop.counter|stringformat:"s" %}
{% with template="mod"|add:y|add:".html" %}
<p>{{ template }}</p>
{% endwith %}
{% endwith %}
{% endfor %}
导致:
<p>mod1.html</p>
<p>mod2.html</p>
<p>mod3.html</p>
<p>mod4.html</p>
<p>mod5.html</p>
<p>mod6.html</p>
...
带有标记的第二个是必需的,因为stringformat标记是使用自动添加的%
实现的。要解决此问题,您可以创建自定义过滤器。我使用类似的东西:
http://djangosnippets.org/snippets/393/
将剪辑保存为some_app / templatetags / some_name.py
from django import template
register = template.Library()
def format(value, arg):
"""
Alters default filter "stringformat" to not add the % at the front,
so the variable can be placed anywhere in the string.
"""
try:
if value:
return (unicode(arg)) % value
else:
return u''
except (ValueError, TypeError):
return u''
register.filter('format', format)
模板中的:
{% load some_name.py %}
{% for x in some_list %}
{% with template=forloop.counter|format:"mod%s.html" %}
<p>{{ template }}</p>
{% endwith %}
{% endfor %}
答案 1 :(得分:3)
您可能不希望在模板中执行此操作,这看起来更像是一个视图作业:(在for循环中使用if)。
chosen_templates=[]
for choice in choice_dict:
if choice =='2':
{% with "mod"|add:forloop.counter|add:".html" as template %}
template_name = "mod%i.html" %index
chosen_templates.append(template_name)
然后将chosen_templates
传递到您只有
{% for template in chosen_templates %}
{% load template %}
{% endfor %}
另外,我不太明白你为什么用dict来选择一个不在dictionnary中的数字的模板。 for key,value in dict.items()
可能是您正在寻找的。 p>
答案 2 :(得分:3)
使用块“with”
尝试不带的{% for choice in choice_dict %}
{% if choice =='2' %}
{% include "mod"|add:forloop.counter|add:".html" %}
{% endif %}
{% endfor %}