7

在 Django 文档中,他们这样说https://docs.djangoproject.com/en/dev/topics/auth/default/#user-objects

from django.contrib.auth.decorators import login_required

@login_required(login_url='/accounts/login/')
def my_view(request):

但是我如何在基于类的视图上使用 login_required

@login_required
classMyCreateView(CreateView):

这给出了错误

'function' object has no attribute 'as_view'

4

2 回答 2

12

您可以通过多种方式做到这一点,例如

https://docs.djangoproject.com/en/dev/topics/class-based-views/#decorating-class-based-views

  1. 无论是这个
 urlpatterns = patterns('',
        (r'^about/', login_required(TemplateView.as_view(template_name="secret.html"))),
        (r'^vote/', permission_required('polls.can_vote')(VoteView.as_view())),
    )
  1. 或这个
class ProtectedView(TemplateView):
    template_name = 'secret.html'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(ProtectedView, self).dispatch(*args, **kwargs)
于 2013-01-14T07:33:22.720 回答
3

对于 Django 1.9 或更高版本;基于类的视图 (CBV) 可以利用mixinauth 包中的。只需使用以下语句导入 -

from django.contrib.auth.mixins import LoginRequiredMixin

mixin 是一种特殊的多重继承。使用mixin主要有两种情况:

  1. 你想为一个类提供很多可选特性。
  2. 你想在很多不同的类中使用一个特定的特性。

了解更多:什么是 mixin,它们为什么有用?


使用 login_required 装饰器的 CBV

网址.py

from django.conf.urls import url
from django.contrib.auth.decorators import login_required
from .views import ListSecretCodes

urlpatterns = [
    url(r'^secret/$', login_required(ListSecretCodes.as_view()), name='secret'),
]

视图.py

from vanilla import ListView

class ListSecretCodes(LoginRequiredMixin, ListView):
    model = SecretCode

使用 LoginRequiredMixin 的 CBV

网址.py

from django.conf.urls import url
from .views import ListSecretCodes

urlpatterns = [
    url(r'^secret/$', ListSecretCodes.as_view(), name='secret'),
]

视图.py

from django.contrib.auth.mixins import LoginRequiredMixin
from vanilla import ListView

class ListSecretCodes(LoginRequiredMixin, ListView):
    model = SecretCode

笔记

上面的示例代码使用django-vanilla轻松创建基于类的视图 (CBV)。通过使用 Django 的内置 CBV 和一些额外的代码行,可以实现相同的目的。

于 2016-08-18T13:15:37.587 回答