Подтвердить что ты не робот

Как я могу связать forloop.counter с строкой в ​​моем шаблоне django?

Я уже пытаюсь конкатенировать вот так:

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

4b9b3361

Ответ 1

Ваша проблема в том, что 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 %}

Ответ 2

Вероятно, вы не хотите делать это в своих шаблонах, это больше похоже на работу вида: (использование 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, чтобы выбрать шаблон с номером, который отсутствует в dictionnary. for key,value in dict.items() может быть тем, что вы ищете.

Ответ 3

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

{% for choice in choice_dict %}
    {% if choice =='2' %}
       {% include "mod"|add:forloop.counter|add:".html" %}                   
    {% endif %}
{% endfor %}