2011-07-08 27 views
7

Soy bastante nuevo en Django (comenzando con 1.3). Al crear una aplicación, fui con las nuevas vistas genéricas basadas en clases desde el primer día, usando una combinación de las clases incorporadas y subclasificándolas donde necesitaba agregarlas al contexto.Vistas genéricas basadas en clase Django y autenticación

Ahora mi problema es que necesito volver a mis puntos de vista y tenerlos accesibles solo para los usuarios que hayan iniciado sesión. TODA la documentación que he encontrado muestra cómo hacer esto con las antiguas vistas genéricas funcionales, pero no con las basadas en clases.

Aquí es una clase de ejemplo:

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 

¿Cómo agrego a la autenticación de Django nuevos puntos de vista basados ​​en la clase?

+0

posible duplicado de [Cómo usar el permiso \ decoradores requeridos en las vistas basadas en la clase django] (http://stackoverflow.com/questions/6069070/how-to-use-permission-required-decorators-on-django- class-based-views) – meshy

Respuesta

19

También existe la opción de una combinación de autenticación, de la que derivaría su clase de vista. Así, utilizando this mixin from brack3t.com:

class LoginRequiredMixin(object): 

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

entonces podría crear una nueva "autenticación requerida" vistas como esto:

from django.views.generic import DetailView 

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

sin otras adiciones necesarias. Se siente muy parecido a No repetir uno mismo.

+0

¡Agradable! Yo prefiero este enfoque. – pwalsh

6

Hay una sección en los documentos en decorating class-based views - si solo quiere usar el antiguo login_required etc., ese es el camino a seguir.

+0

genial, eso me ayuda a comenzar, gracias. – pwalsh

+1

me gusta usar el método de envío descrito en el mismo enlace, solo para mantener el urlconf más limpio. Otro método es subclasificar DetailView con el método de envío y llamarlo RestrictedDetailView luego la subclase RestrictedDetailView en otro lugar – Dave

+0

Tenga en cuenta que el enlace anterior ha cambiado. Ver https://docs.djangoproject.com/en/dev/topics/class-based-views/intro/#decorating-the-class ahora –

5

que estoy describiendo un método para decorar cualquier 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) 

Después de escribir una vista basada clase como esta, se puede insertar directamente cualquier decorador basada en función de la url como tal.

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