Как я могу объединить forloop.counter со строкой в ​​моем шаблоне django - PullRequest
18 голосов
/ 20 апреля 2011

Я уже пытаюсь объединить так:

{% 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.Кто-нибудь знает, что происходит и что я могу сделать, чтобы решить эту проблему?Большое спасибо!

Ответы [ 3 ]

45 голосов
/ 20 апреля 2011

Ваша проблема в том, что 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 %}
3 голосов
/ 15 ноября 2013

Попробуйте без , используя блок "с"

{% for choice in choice_dict %}
    {% if choice =='2' %}
       {% include "mod"|add:forloop.counter|add:".html" %}                   
    {% endif %}
{% endfor %} 
3 голосов
/ 20 апреля 2011

Вы, вероятно, не хотите делать это в своих шаблонах, это больше похоже на работу представлений: (использование if внутри цикла for).

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 для выбора шаблона с номером, которого нет в словаре. for key,value in dict.items() может быть то, что вы ищете.

...