您的问题是 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>
...
第二个 with 标记是必需的,因为 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 %}