it-swarm.com.ru

Как разбить "для цикла" в шаблоне Django

У меня есть этот код

    {% for account in object_list %}
        <tr>
        {% for field, value in book.get_fields %}
              <th>{{ field.verbose_name }}</th> 
        {% endfor %}
        </tr>
    {{ break }}
    {% endfor %}

Я хочу разорвать цикл for после первой итерации. перерыв не работает 

31
tej.tan

В системе шаблонов Django нет break. Система шаблонов Django не программируется с помощью python, а на своем собственном языке .

В зависимости от того, что вам нужно сделать, вы можете найти этот вопрос полезным. В противном случае просто поместите one and only account, который вы пытаетесь распечатать, в HTML, в специальное поле вашей RequestContext.

16
Pablo Santa Cruz

Я думаю, что вы должны использовать ломтик для достижения своей цели

{% for account in object_list|slice:":1" %}
88
Turikumwe

Вы не можете использовать оператор break, но вы можете не печатать их на html. Это не лучшее решение, но вы можете использовать его. Я использую следующий;

{%for tumbnail in image %}
         {%if tumbnail.object_id == element.id %}
          <img src="/media/{{ tumbnail.image }}" class="tr_all_hover"alt="">

{{ "<!--" }}
  {%endif%} 
{%endfor%}     
{{ "-->" }}

В основном это выглядит так в браузере . http://i.stack.imgur.com/MPbR3.jpg

2
Brkyrn

Я нашел способ сделать это с условием. Это уродливо и нахально, но работает (для меня). first - это то, чего хотел ОП, но это более точно отвечает на реальный вопрос.

Учитывая это:

obj = {
  'children': [
    { 'possessions' : { 'toys': [] } },
    { 'possessions' : { 'toys': ['train'] } }
    { 'possessions' : { 'toys': ['train', 'ball'] } }
  ]
}

Я хотел знать, есть ли у моего ребенка дети с игрушками.

Вот что я сделал:

Эквивалент Python:

if ([child for child in obj.children if child.possessions.toys]):
  # Whatever

Джанго Шаблон:

Мой подход заключался в использовании regroup для создания наборов кандидатов, которые соответствовали или не соответствовали критериям:

{% regroup obj.children by possessions.toys|length_is:"0" as by_toys %}
{% for check in by_toys %}{% if check.grouper == False %}
  Whatever
{% endif %}{% endfor %}

regroup создает новый объект, который по существу:

[
  { 'grouper': '', 'list': [/*...*/] },
  { 'grouper': True, 'list': [/*...*/] },
  { 'grouper': False, 'list': [/*...*/] }
]

length_is:"0" обеспечивает наличие в этом списке не более трех элементов, а grouper является либо True, либо False, либо ''. Затем мы перебираем список и проверяем значение False.

  • Если нет дочерних элементов, это будет пустой список, и переменная if никогда не будет нажата.
  • Если у детей нет игрушек, это был бы список без Falsegrouper.
  • Если бы у всех детей были игрушки, это был бы список с Falsegrouper.
  • Если у некоторых детей есть игрушки, это будет список с False и Truegroupers.
1
Hounshell

В этом случае вы можете проверить, если forloop.counter == 1 или forloop.first, и просто напечатать этот первый элемент.

  {% for account in object_list %}
      {% if forloop.first %}
        <tr>
        {% for field, value in book.get_fields %}
              <th>{{ field.verbose_name }}</th> 
        {% endfor %}
        </tr>
      {% endif %}
    {% endfor %}
0
somecallitblues

Вы можете использовать вашу систему шаблонов Django для цикла в javascript для цикла как внутренний цикл и можете использовать break следующим образом: -

for(var i=0;i<1;i++){
        {% for owner in Owner %}
            id  = "{{owner.id}}";
            if(id == pk1){
                f="{{owner.flat}}";
                break;
            }             
        {% endfor %}
     }
0
Rohit Shekhar