django中基于类的视图上的login_required装饰器

时间:2020-03-26 16:20:09

标签: python django decorator attributeerror login-required

我有一个基于工人阶级的观点。但是在添加@login_required时出现错误:

AttributeError:“函数”对象没有属性“ 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 个答案:

答案 0 :(得分:1)

@Login_Required装饰器仅装饰函数,而不装饰类,您可以使用mixin,也可以装饰.as_view()调用结果的函数。

选项1:使用LoginRequiredMixin

您可以利用将ListView放在父类中的LoginRequiredMixin [Django-doc]之前,将它们放在父类中:

from django.contrib.auth.mixins import LoginRequiredMixin

class ResultListView(LoginRequiredMixin, ListView):
    template_name = …

    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/', login_required(ResultListView.as_view()), name='meetings'),
]