Построение списка в шаблонах Django - PullRequest
35 голосов
/ 09 декабря 2010

С этим кодом:

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

Я получаю TemplateSyntaxError:

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

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

Ответы [ 7 ]

55 голосов
/ 01 июля 2012

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

page.html:

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

Результаты:

1
2
3
26 голосов
/ 09 декабря 2010

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

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

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

13 голосов
/ 22 декабря 2015

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

from django import template
register = template.Library()

# use @register.assignment_tag
# only when you're working with django version lower than 1.9
@register.simple_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

10 голосов
/ 06 февраля 2013

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

Я сталкивался с этим вопросом в поисках способа создания 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 = "Modality").

Если мне нужно сделать 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.

6 голосов
/ 25 июля 2014

Самое простое это сделать

{% for x in "123" %}
2 голосов
/ 09 декабря 2010

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

0 голосов
/ 26 июня 2018

Это может быть вдохновением. Используйте встроенный фильтр add.

{{ first|add:second }}

first is [1, 2, 3] and second is [4, 5, 6], then the output will be [1, 2, 3, 4, 5, 6].

This filter will first try to coerce both values to integers. 
If this fails, it'll attempt to add the values together anyway. 
This will work on some data types (strings, list, etc.) and fail on others. 
If it fails, the result will be an empty string.

Официальная спецификация, https://docs.djangoproject.com/zh-hans/2.0/ref/templates/builtins/#built-in-filter-reference

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...