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

Создание списка в шаблонах Django

С помощью этого кода:

{% for o in [1,2,3] %}
    <div class="{% cycle 'row1' 'row2' %}">
        {% cycle 'row1' 'row2' %}
    </div>
{% endfor %}

Я получаю a TemplateSyntaxError:

Could not parse the remainder: '[1,2,3]' from '[1,2,3]'

Есть ли способ создания списка в шаблоне?

4b9b3361

Ответ 1

Вы можете сделать это с помощью хитрого использования фильтра make_list, но это, вероятно, плохая идея:

{% for o in "123"|make_list %}
    <div class="{% cycle 'row1' 'row2' %}">
        {% cycle 'row1' 'row2' %}
    </div>
{% endfor %}

p.s. Кажется, вы не используете o в любом месте, поэтому я не уверен, что вы пытаетесь сделать.

Ответ 2

Мы можем использовать метод split для объекта str:

page.html:

{% with '1 2 3' as list %}
  {% for i in list.split %}
    {{ i }}<br>
  {% endfor %}
{% endwith %}

Результаты:

1
2
3

Ответ 3

Другие ответы здесь похожи на билет (по крайней мере, на то, что я хотел), поэтому я дам ответ на вопрос, почему вы, возможно, захотите сделать что-то подобное (и, возможно, там будет лучший ответ для моего дела, чем то, что были предоставлены):

Я столкнулся с этим вопросом, ища способ построить 3 очень похожие, но не идентичные кнопки с использованием Bootstrap. Одна кнопка может выглядеть как

<div class="btn-group">
  <a class="btn btn-primary dropdown-toggle" data-toggle="dropdown" href="#">
    Modality
    <span class="caret"></span>
  </a>
  <ul class="dropdown-menu" id="Modality">
    <li><a href="#">Action</a></li>
  </ul>
</div>

где разница между кнопками ограничивается текстом кнопки (модальность, на ее собственной строке выше), а содержимое соответствующей кнопки, которую мы предположим, заполняется динамически JS (ссылаясь на id = Модальность ").

Если мне нужно сделать 10 из них, копирование/вставка HTML кажется немым и утомительным, особенно если я хочу изменить что-нибудь о моей кнопке после факта (например, сделать все сплит-вниз), и это будет против DRY.

Итак, вместо этого в шаблоне я мог бы сделать что-то вроде

{% with 'Modality Otherbutton Thirdbutton' as list %}
  {% for i in list.split %}
    <!-- copy/paste above code with Modality replaced by {{ i }} -->
  {% endfor %}
{% endwith %}

Теперь, предоставленные в этом конкретном случае, кнопки добавляют функциональность в некоторую связанную сетку данных, поэтому имена кнопок могут быть динамически заполнены из данных, полученных с помощью модели django, но я не на этом этапе своего дизайна теперь, и вы можете видеть, где такая функциональность желательно поддерживать DRY.

Ответ 4

Проще всего сделать

{% for x in "123" %}

Ответ 5

Вероятно, уже слишком поздно. Я сделал этот тег шаблона для достижения этой цели.

from django import template
register = template.Library()

# you might want to use simple_tag if you are on 1.9 or higher version
@register.assignment_tag
def to_list(*args):
    return args

использовать его в шаблоне:

{% load your_template_tag_file %}
{% to_list 1 2 3 4 5 "yes" as my_list %}
{% for i in my_list %}
    {{ i }}
{% endfor %}

Ссылка здесь: Теги назначения Django

Ответ 6

drdger верен, вы не можете этого сделать в преднамеренно искалеченном шаблоне Django lanuage. Перейдите в список как переменную контекста при вызове шаблона или попробуйте тег шаблона, например expr. Затем вы можете сказать {% expr [1,2,3] as my_list %}, а затем использовать my_list в цикле for.