Сегодня Django снова порадовала, мне требовалось отобразить список категорий с под категориями
не важно можно с ul-li.
мне надо было завернуть всё это в красивый селект, ну вот что-то вроде этого.
в хтмл это примерно вот так
[cc lang=”html”]
[/cc]
Допустим у меня есть 2 вот таких модели в вакууме.
Одна: категория – Firefox (как в примере выше.)
[cc lang=”python”]
class Category(models.Model):
name = models.CharField(max_length=100)
def __unicode__(self):
return self.name[/cc]
И вторая не посредственно список, где есть поле указывающее на связь с родителем
[cc lang=”python”]
class SubCategory(models.Model):
category_name = models.ForeignKey(Category)
name = models.CharField(max_length=200)
def __unicode__(self):
return self.name[/cc]
Едем дальше.
в PHP, я бы в цикле прорисовки категорий поставил бы ещё один цикл выбирающий всех детей для данной категории. (хаха – много запросов ну и ладно)
Но тут у нас всё интереснее, в притом намного.
Мы во views должны сформировать что-то и отправить в шаблон уже как-то почти готовое для отображения.
Хочется городить велосипед, но тут Документация Django какбэ подсказывает
что есть такая хреновая, которая мне поможет.
Суть её в том, что тот массив что придёт к нам она может пересортироватьперегруппировать по любому полю, и поможет нам красиво его отобразить.
В итоге во views.py я делаю выборку того, что мне нужно.
Например вот так:
[cc lang=”python”]sub_category_list = SubCategory.objects.all()[/cc]
И всё вот это мы отправляем тихо мирно в шаблон.
А в шаблоне нас встретит уже магический regroup
Вот с такой конструкцией
[cc lang=”python”]
{% regroup sub_category_list by category_name as categ_list %}
[/cc]
Теперь по порядку.
[cc lang=”python”]{% regroup sub_category_list by category_name as categ_list %}[/cc]
Группируем sub_category_list по полю category_name и называем результат categ_list
Дальше создаём html элемент, тут я думаю всё понятно.
и начинаем разбирать то, что у нас в categ_list
[cc lang=”python”]{% for ca in categ_list %}[/cc]
Тут рассказывать ничего не надо, перебираем элементы по порядку
[cc lang=”python”]
{% endfor %}
[/cc]
Вот и завершили все наши дела.
и получили нечто похожее на селект рутреккера тот, что в самом верху.
просто красиво и со вкусом.
0 Комментарии。