it-swarm.com.ru

Построение списка в шаблонах Django

С этим кодом:

{% 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]'

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

32
zjm1126

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

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

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

25
Dominic Rodger

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

page.html:

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

Результаты :

1
2
3
49
Zulu

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

Я наткнулся на этот вопрос в поисках способа создания 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>

где разница между кнопками ограничена текстом кнопки (Modality, в отдельной строке выше) и содержимым, относящимся к кнопке, которое, как мы предполагаем, динамически заполняется 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, но я сейчас не на той стадии в моем дизайне, и Вы можете видеть, где такая функциональность является желательной для поддержания СУХОГО.

10
Alex Whittemore

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

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

8
rabbit.aaron

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

{% for x in "123" %}
6
Jonathan Liuti

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

2
Peter Rowell

Это может быть вдохновением. Используйте встроенный фильтр 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

0
W.Perrin