Django Class-Based Generic Views and Authentication

北慕城南 提交于 2019-11-30 08:35:58

问题


I am pretty new to Django (starting with 1.3). In building an app, I went with the new class-based generic views from day one, using a combination of the built in classes and subclassing them where I needed to add to the context.

Now my problem is, I need to go back to my views, and have them accessible only to logged in users. ALL the documentation I have found shows how to do this with the old functional generic views, but not with class-based.

Here is an example class:

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

How do I add authentication to django's new class-based views?


回答1:


There's also the option of an authentication mixin, which you would derive your view class from. So using this mixin from brack3t.com:

class LoginRequiredMixin(object):

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(LoginRequiredMixin, self).dispatch(*args, **kwargs)

you could then create new "authentication required" views like this:

from django.views.generic import DetailView

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

with no other additions needed. Feels very much like Not Repeating Oneself.




回答2:


There's a section in the docs on decorating class-based views -- if you just want to use the old login_required etc., that's the way to go.




回答3:


I am describing a method to decorate any 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)

After writing a class based view like this, you can directly insert any function based decorator into the url as so.

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


来源:https://stackoverflow.com/questions/6629426/django-class-based-generic-views-and-authentication

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!