Django基于类的通用视图和认证

时间:2011-07-08 19:26:16

标签: django django-class-based-views django-1.3

我对Django很新(从1.3开始)。在构建应用程序时,我从第一天开始使用新的基于类的通用视图,使用内置类的组合并将它们子类化为我需要添加到上下文的位置。

现在我的问题是,我需要回到我的观点,并且只有登录用户才能访问它们。我找到的所有文档都显示了如何使用旧的功能通用视图执行此操作,而不是基于类。

以下是一个示例类:

class ListDetailView(DetailView):
    context_object_name = "list"

    def get_queryset(self):
        list = get_object_or_404(List, id__iexact=self.kwargs['pk'])
        return List.objects.all()

    def get_context_data(self, **kwargs):
        context = super(ListDetailView, self).get_context_data(**kwargs)
        context['subscriber_list'] = Subscriber.objects.filter(lists=self.kwargs['pk'])
        return context

如何为django新的基于类的视图添加身份验证?

3 个答案:

答案 0 :(得分:19)

还可以选择身份验证mixin,您可以从中派生视图类。所以使用this mixin from brack3t.com

class LoginRequiredMixin(object):

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(LoginRequiredMixin, self).dispatch(*args, **kwargs)
然后,您可以创建新的“需要身份验证”视图,如下所示:

from django.views.generic import DetailView

class MyDetailView(LoginRequiredMixin, DetailView):
    ....

没有其他需要添加。感觉非常像不重复自己。

答案 1 :(得分:6)

decorating class-based views上的文档中有一个部分 - 如果您只想使用旧的login_required等,那就可以了。

答案 2 :(得分:4)

我正在描述一种装饰任何ListView的方法:

class MyListView(ListView):
    decorator = lambda x: x

    @method_decorator(decorator)
    def dispatch(self, request, *args, **kwargs):
       return super(MyListView, self).dispatch(request, *args, **kwargs)

写完这样的基于类的视图后, 你可以直接将任何基于函数的装饰器插入到url中。

url(r'^myurl/$', MyListView.as_view(decorator=login_required))