Ваша проблема в том, что forloop.counter является целым числом, и вы используете шаблонный фильтр add
, который будет работать правильно, если вы передадите ему все строки или все целые числа, но не сочетание.
Oneспособ обойти это:
{% 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 %}