Link Search Menu Expand Document

Класс 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') используется для того, чтобы все наши новости подгрузились одним запросом. Только для связей ‘один ко сногим’. Для связи ‘многие ко многим’ используется другая функция ‘жадной’ загрузки.

Подробнее