Какая гибкость в цикле Django for? - PullRequest
3 голосов
/ 08 июня 2009

Я выводю серию объектов Django в шаблон:

{% for obj in list %}
    ...
{% endfor %}

Но я бы хотел вывести только первые пять из них, а затем поместить остаток в отдельную <DIV>. Идея в том, что я могу скрыть вторую половину, пока не потребуется.

Я предполагаю что-то подобное, но нужно ограничить повторяющиеся элементы:

{% for obj in list %}
    ...
{% endfor %}

<a href="" onclick="unhide()">Show hidden</a>
<div id="hidden">
    {% for obj in list %}
        ...
    {% endfor %}
</div>

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

Ответы [ 3 ]

16 голосов
/ 08 июня 2009

Вы можете использовать slice:

{% for obj in list|slice:":5" %}
    ...
{% endfor %}

<a href="" onclick="unhide()">Show hidden</a>
<div id="hidden">
    {% for obj in list|slice:"5:" %}
        ...
    {% endfor %}
</div>
7 голосов
/ 08 июня 2009

Борьба с ограничениями шаблонов часто может быть признаком того, что жизнь может быть проще, если вы проделали больше работы в своем представлении:

context = {
  'visible_list': mylist[:5],
  'hidden_list': mylist[5:]
}

Я не говорю, что это обязательно лучше, чем приведенное выше решение для фильтра срезов, но часто стоит рассмотреть возможность передачи вашим шаблонам объекта контекста со всем хорошо настроенным. Это позволяет вам легче адаптироваться, если логика станет еще сложнее.

Логика представления довольно неплохо видна. Я не считаю это "загрязнением".

2 голосов
/ 08 июня 2009

Конечно, например, вы можете сделать цикл дважды и использовать внутри него forloop.counter в подходящих if конструкциях - первый раз, когда делать что-то, только когда он <= 5, второй раз, только когда он > 5 (помните, что это основано на 1 - если вы хотите на основе 0, вместо этого используйте forloop.counter0).

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