Even though its a class why is AttributeError: 'function' object has no attribute 'as_view'

Even though its a class why is AttributeError: 'function' object has no attribute 'as_view'

尽管它是一个基于类的函数,但为什么在我使用 login_required

时会弹出此属性错误

错误信息

path('active/<int:pk>', UpdateActiveStatus.as_view(), name="activeStatus"),
AttributeError: 'function' object has no attribute 'as_view'

views.py

@login_required(login_url='/admin/')
class UpdateActiveStatus(UpdateView):
    model = Timeline
    form_class = UpdateActiveStatus
    template_name = 'timeline.html'
    success_url = reverse_lazy('timeline')

你不能使用@login_required decorator [Django-doc]:这个装饰器returns一个函数,但是即使使用这个函数也不行:这个装饰器根本无法处理一个class.

对于基于 class 的视图,您使用 LoginRequiredMixin [Django-doc]:

from django.contrib.auth.mixins import <strong>LoginRequiredMixin</strong>

class UpdateActiveStatus(<strong>LoginRequiredMixin</strong>, UpdateView):
    model = FutsalTimeline
    form_class = UpdateActiveStatus
    template_name = 'timeline.html'
    success_url = reverse_lazy('timeline')
    <strong>login_url = '/admin/'</strong>

我认为问题是由 装饰器 产生的。只需将其更改为 ->

@method_decorator(login_required, name='dispatch')
class UpdateActiveStatus(UpdateView):
    model = FutsalTimeline
    form_class = UpdateActiveStatus
    template_name = 'timeline.html'
    success_url = reverse_lazy('timeline')

您可以找到文档 here

  • 但是你应该使用 Mixin classes。使用 Mixin class 它看起来像

      from django.contrib.auth.mixins import LoginRequiredMixin
      class UpdateActiveStatus(LoginRequiredMixin, UpdateView):
          model = FutsalTimeline
          form_class = UpdateActiveStatus
          template_name = 'timeline.html'
          success_url = reverse_lazy('timeline')
    

您可以找到文档 here