2009-06-07 2 views
3

Я выводит серию Django объектов в шаблоне:Насколько гибкость существует в цикле 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> 

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

ответ

16

Вы можете использовать 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> 
2

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

7

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

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

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

Презентационная логика прекрасно выглядит на вид. Я не особо воспринимаю это как «загрязнение».

+1

Этот подход имеет дополнительное преимущество, заключающееся в том, что очень легко добавить условное выражение в шаблон, чтобы не показывать «Показать скрытые», если нет скрытых. –

Смежные вопросы