Django中类视图的login_required装饰器

7

我持有一种基于工作类的观点。但是当添加@login_required时,我遇到了以下错误:

AttributeError: 'function' object has no attribute '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在通过装饰器时会失去其属性。


您可以使用method_decorator装饰类。然而,我更喜欢像Willem建议的那样使用LoginRequiredMixin - Alasdair
1个回答

17

@login_required修饰符仅修饰函数,而不是类,您可以利用mixin,或者修饰.as_view()调用的结果函数。

选项1:使用LoginRequiredMixin

您可以使用LoginRequiredMixin [Django-doc],需要将其放置在父类中ListView之前:

from django.contrib.auth.mixins import LoginRequiredMixin

class ResultListView(<b>LoginRequiredMixin,</b> ListView):
    template_name = …

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

选项二:装饰.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'),
]

1
啊哈,我明白了,是的,那很有道理!感谢您快速而准确的回复! - eneas max
哪个方法更好? - undefined
1
@ByteInsight:我建议使用mixin,因为你还可以将它组合到其他mixin和你子类化的视图中。所以一旦你在一个视图中混合它,那个视图的所有子类也将需要登录。 - undefined
LoginRequiredMixin和@login_required之间的主要区别在于LoginRequiredMixin是一个mixin,而@login_required是一个装饰器。LoginRequiredMixin是一个抽象类,可以被视图类继承。当一个视图继承自LoginRequiredMixin时,Django会检查发出请求的用户是否已经通过身份验证。@login_required是一个装饰器,可以用来装饰一个视图函数。类 vs 视图 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接