пятница, 24 мая 2013 г.

inclusion_tag или Как отображать повторяющиеся блоки в шаблоне Django

Очень часто возникает необходимость отобразить в шаблоне Django повторяющиеся элементы. В нашем примере это будут призеры конкурса:


Как грамотно написать код для вывода повторяющихся элементов?


Вынесем оформление каждого призера в отдельный файл block_prizer.html:

Место {{ prizer.place }}

{{ prizer.collection.title }}
Данный файл мы можем подключить в шаблоне и отрендерить посредством нашего шаблонного тега, который будет создан при помощи inclusion_tag посредством декорирования. В папке нашего приложения создадим директорию templatetags (и файл __init__.py) и поместим туда файл collection_extras.py:
from django import template

register = template.Library()

@register.inclusion_tag('collection/block_prizer.html')
def show_prizer(prizer):
    "Show prizer template in prizer list"
    return {'prizer': prizer}

Теперь мы можем при помощи нашего тэга show_prizer подключать и рендерить шаблон block_prizer.html. Для этого нужно в главном шаблоне импортировать библиотеку наших кастомных тэгов, а затем передать в наш кастомный тэг show_prizer переменную:
{% load collection_extras %}

Список призеров

{% for prizer in prizer_year_list|dictsort:'nomination.title' %} {% ifchanged %}

{{ prizer.nomination.title }}

{% endifchanged %} {% show_prizer prizer %} {% endfor %}

Комментариев нет:

Отправить комментарий