Класс ListView
Django позволяет использовать не контроллеры функции, а контроллеры классы (CBV)
Для того чтобы использовать данный класс, его необходимо импортировать в файле views.py
:
from django.views.generic import ListView
Данный класс (как это видно из названия) предназначе для работы со списками. Например со списком новостей или категорий. Задача этого класса - вернуть какой-то список.
Файле urls.py
необходимо указать новый URL параметр для вывода страницв:
path('', HomeNews.as_view(), name='home')
class HomeNews(ListView):
model = News
template_name = 'news/home_news_list.html'
context_object_name = 'news'
extra_context = {'title': 'Главная'}
allow_empty = False
Параметр | Описание | По умолчанию (если не указано) |
---|---|---|
model | Указываем имя модели с которой работаем | Единственный обязательный параметр |
template_name | Адрес шаблона | имя_модели_list.html |
context_object_name | Переменная передавая в шаблон | {% object_list %} |
extra_context | Передаем дополнительные данные | |
allow_empty | Разрешение или запрет показа пустых списков | По умолчанию вызов пустого списка приведет к ошибке 500 вместо 404 |
extra_context
нужно использовать только для статичных данных. Для динамических данных нужно использовать функцию get_context_data
class HomeNews(ListView):
model = News
template_name = 'news/home_news_list.html'
context_object_name = 'news'
def get_context_data(self, *, object_list=None, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = 'Главная страница'
return context
Для фильтрации вывода исользуется метод get_queryset
:
def get_queryset(self):
return News.objects.filter(is_published=True).select_related('category')
В данном случае мы выводим только те новости, которые отмечены как опубликованные.
select_related('category')
используется для того, чтобы все наши новости подгрузились одним запросом. Только для связей ‘один ко сногим’. Для связи ‘многие ко многим’ используется другая функция ‘жадной’ загрузки.