Создание списка в шаблонах 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]'
Есть ли способ создания списка в шаблоне?
Ответы
Ответ 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.