get_queryset() — метод для кастомизации набора данных в CBV.
Фильтрация по текущему пользователю
from django.views.generic import ListView
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Task
class MyTaskListView(LoginRequiredMixin, ListView):
model = Task
template_name = 'tasks/my_tasks.html'
def get_queryset(self):
return Task.objects.filter(owner=self.request.user)
Фильтрация из GET-параметров
class TaskListView(ListView):
model = Task
def get_queryset(self):
qs = Task.objects.all()
status = self.request.GET.get('status')
if status:
qs = qs.filter(status=status)
q = self.request.GET.get('q')
if q:
qs = qs.filter(title__icontains=q)
return qs.order_by('-created_at')
Зависимость от URL-параметров
# URL: /projects/<pk>/tasks/
class ProjectTaskListView(ListView):
model = Task
def get_queryset(self):
project_pk = self.kwargs['pk']
return Task.objects.filter(
project__pk=project_pk,
owner=self.request.user,
)
DetailView — ограничение доступа
class TaskDetailView(LoginRequiredMixin, DetailView):
model = Task
def get_queryset(self):
# 404 если задача не принадлежит пользователю
return Task.objects.filter(owner=self.request.user)
vs get_context_data
| Метод | Цель |
|---|---|
get_queryset() |
Определить набор объектов для отображения |
get_context_data() |
Добавить дополнительные переменные в шаблон |
get_queryset() запускается до get_context_data() — результат доступен через self.object_list или self.object.
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!