Обычно это делается путем переопределения метода get_queryset
в подклассе из ListView
. Таким образом, вы можете создать представление:
# app/views.py
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic.list import ListView
from app.models import Question
class QuestionListView(LoginRequiredMixin, ListView):
model = Question
template_name='testapp/question_list.html'
context_object_name='questions'
def get_queryset(self, *args, **kwargs):
return super().get_queryset(*args, **kwargs).filter(
<b>user_id=self.request.user.id</b>
)
В urls.py
вы затем используете QuestionListView
# app/urls.py
from django.urls import path
from app.views import QuestionListView
urlpatterns += [
path('myqn/', <b>QuestionListView.as_view()</b>, name='myqn'),
]
Вы можете определить функцию или лямбда-выражение с помощью:
import inspect
def <b>custom_queryset</b>(*args, **kwargs):
self = inspect.currentframe().f_back.f_locals['self']
return Question.objects.filter(
user_id=self.request.user.id
)
urlpatterns += [
path('myqn/', QuestionListView.as_view(<b>get_queryset=custom_queryset</b>), name='myqn'),
]
Это, однако, не лучшая идея. Прежде всего, он проверяет стек вызовов, и если позже ListView
будет изменен, он может больше не работать. Кроме того, здесь этот список не будет проверять, например, авторизовался ли пользователь. Мы не можем использовать порядок разрешения методов (MRO) для вызова метода super()
.
Примечание : вы можете ограничить представления представлением на основе классов для аутентифицированных пользователей с помощью LoginRequiredMixin
mixin [Django -doc] .