login_required декоратор для представления на основе классов в django - PullRequest
1 голос
/ 26 марта 2020

У меня есть представление на основе рабочего класса. Но при добавлении @login_required я получаю ошибку:

AttributeError: объект 'function' не имеет атрибута 'as_view'

Что-то происходит с ResultListView здесь:

from django.urls import path
from .views import ResultListView


urlpatterns = [
    path('meetings/', ResultListView.as_view(), name='meetings'),
]

Мои views.py:

@login_required
class ResultListView(ListView):
    template_name = ...

    def get_queryset(self):
        return Result.objects.filter(rider__user=self.request.user)

Что все работало нормально, пока я не установил декоратор. Сейчас очень смущенно, я не понимаю, почему ResultListView должен потерять свои атрибуты при отправке через декоратор.

1 Ответ

1 голос
/ 26 марта 2020

Декоратор @Login_Required декорирует только функции, а не классы, вы можете использовать миксины или декорировать функцию, которая является результатом вызова .as_view().

Опция 1: Использование LoginRequiredMixin

Вы можете использовать LoginRequiredMixin [Django -doc] , который нужно поставить перед ListView в родительских классах:

from django.contrib.auth.mixins import LoginRequiredMixin

class ResultListView(<b>LoginRequiredMixin,</b> ListView):
    template_name = &hellip;

    def get_queryset(self):
        return Result.objects.filter(rider__user=self.request.user)

Вариант 2: декорировать .as_view() результат

Альтернативой является декорирование результата .as_view, который действительно является функцией:

from django.urls import path
from .views import ResultListView
from django.contrib.auth.decorators import login_required

urlpatterns = [
    path('meetings/', <b>login_required(</b>ResultListView.as_view()<b>)</b>, name='meetings'),
]
...