Сегодня Django снова порадовала, мне требовалось отобразить список категорий с под категориями
не важно можно с ul-li.
мне надо было завернуть всё это в красивый селект, ну вот что-то вроде этого.

в хтмл это примерно вот так
Допустим у меня есть 2 вот таких модели в вакууме.
Одна: категория – Firefox (как в примере выше.)
name = models.CharField(max_length=100)
def __unicode__(self):
return self.name
И вторая не посредственно список, где есть поле указывающее на связь с родителем
category_name = models.ForeignKey(Category)
name = models.CharField(max_length=200)
def __unicode__(self):
return self.name
Едем дальше.
в PHP, я бы в цикле прорисовки категорий поставил бы ещё один цикл выбирающий всех детей для данной категории. (хаха – много запросов ну и ладно)
Но тут у нас всё интереснее, в притом намного.
Мы во views должны сформировать что-то и отправить в шаблон уже как-то почти готовое для отображения.
Хочется городить велосипед, но тут Документация Django какбэ подсказывает
что есть такая хреновая, которая мне поможет.
Суть её в том, что тот массив что придёт к нам она может пересортироватьперегруппировать по любому полю, и поможет нам красиво его отобразить.
В итоге во views.py я делаю выборку того, что мне нужно.
Например вот так:
И всё вот это мы отправляем тихо мирно в шаблон.
А в шаблоне нас встретит уже магический regroup
Вот с такой конструкцией
<select id="id_sub">
<option value="">-----</option>
{% for ca in categ_list %}
<optgroup label="{{ca.grouper}}">
{% for item in ca.list %}
<option value="{{ item.id }}"> {{ item.name }}</option>
{% endfor %}
</optgroup>
{% endfor %}
</select>
Теперь по порядку.
Группируем sub_category_list по полю category_name и называем результат categ_list
Дальше создаём html элемент, тут я думаю всё понятно.
и начинаем разбирать то, что у нас в categ_list
Тут рассказывать ничего не надо, перебираем элементы по порядку
Тут мы выводим то почему мы группировали {{ca.grouper}}
Вложенный цикл, обходим то, что внутри группы (тут нам помогает ca.list )
Собственно выводим всю эту красоту в конечный элемент