В этом разделе мы рассмотрим добавление своего менеджера в модель Post, добавим для нее фильтрацию по статусу, чтобы не выводить неопубликованные записи. По аналогии с менеджером у блога на функциях, нам необходимо добавить менеджер в этот проект:
class PostManager(models.Manager):
"""
Кастомный менеджер для модели постов
"""
def get_queryset(self):
"""
Список постов (SQL запрос с фильтрацией по статусу опубликованно)
"""
return super().get_queryset().filter(status='published')
class Post(models.Model):
# Поля модели
objects = models.Manager()
custom = PostManager()
# Мета классы и методы модели
При работе с блогом на функциях, мы переопределяли функцию get_queryset(), которая выполняется при любых ORM запросах. В этом проекте мы также переопределим функцию get_queryset(), чтобы выводить только опубликованные записи по обращению через менеджер.
Так как мы решили сделать менеджер модели custom, то нам необходимо поменять вызовы модели в представлениях на свой менеджер. Сделать это можно через добавление параметра queryset к PostListView, PostFromCategory:
class PostListView(ListView):
model = Post
template_name = 'blog/post_list.html'
context_object_name = 'posts'
paginate_by = 2
queryset = Post.custom.all() # Переопределение вызова модели
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = 'Главная страница'
return context
class PostFromCategory(ListView):
template_name = 'blog/post_list.html'
context_object_name = 'posts'
category = None
paginate_by = 1
def get_queryset(self):
self.category = Category.objects.get(slug=self.kwargs['slug'])
queryset = Post.custom.filter(category__slug=self.category.slug)
if not queryset:
sub_cat = Category.objects.filter(parent=self.category)
queryset = Post.custom.filter(category__in=sub_cat)
return queryset
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = f'Записи из категории: {self.category.title}'
return context
Теперь давайте одну из наших статей сделаем черновиком, и посмотрим, выведется ли она в списке:
И теперь если мы перейдем на главную страницу сайта, то увидим что запись, которая не была опубликована (Статус записи: Черновик), не отображается в нашем блоге: