2012-04-26 13 views
7

La situación es bastante simple: Escribo un sistema de blog multiusuario. El sistema debe evitar que un no propietario edite o elimine una publicación de blog. En mi opinión, uso la vista genérica.Agregar permiso de nivel de objeto a la vista genérica

BlogUpdateView clase (UpdateView): ...

Sé que debería utilizar para decorar @method_decorator método de envío. Sin embargo, la mayoría del ejemplo es simplemente @method_decorator (login_required) o permiso de nivel de modelo. ¿Cómo se puede aplicar el permiso de nivel de objeto para verificar si request.user es el autor de esta publicación de blog? Por ejemplo, traté de usar aplicaciones django-authority, y tengo una clase BlogPermission en este archivo. e intenté definir un método en esta clase, p.

def blog_edit(self, ??, ??)

¿Qué debo poner en este método?

y luego llamar a esto como: @method_decorator(permission_required('blog_permission.blog_edit(???)'))

¿Qué debería pasar aquí?

Actualización: Después de leer el código method_decorator, me parece que solo puede aceptar la función sin argumento. Creo que es por eso que el permiso requerido no funciona aquí. Pero ¿cuál es el trabajo alrededor de esto?

solución Actualización:

En el método de envío, puedo comprobar el permiso del usuario y luego regresar HttpResponseForbidden() si el usuario no cumple con el permiso.

+0

Puede comprobar sus permisos en 'método get_object'. Los decoradores no se ven bien con CBV. – ilvar

+0

, ¿quiere decir que no hay una manera fácil de aplicar el decorador de objetos a la vista genérica basada en la clase? @ilvar – Xinghan

+0

Quiero decir que será más fácil de hacer en 'get_object'. Para hacerlo más SECO puedes hacer un Mixin con ese 'get_object' y usarlo. – ilvar

Respuesta

11

Puede hacerlo utilizando basadas en la clase vistas:

class BlogEdit(UpdateView): 
    model = Blog 

    def dispatch(self, request, *args, **kwargs): 
     if not request.user.has_perm('blog_permission.blog_edit'): 
      return HttpResponseForbidden() 
     return super(BlogEdit, self).dispatch(request, *args, **kwargs) 

    # OR (for object-level perms) 

    def get_object(self, *args, **kwargs): 
     obj = super(BlogEdit, self).get_object(*args, **kwargs) 
     if not obj.user == self.request.user: 
      raise Http404 # maybe you'll need to write a middleware to catch 403's same way 
     return obj 
+2

La excepción incorporada 'django.core.exceptions.PermissionDenied' se puede generar para mostrar la página de error 403 de' get_object'. A continuación, puede personalizar el error en la plantilla '403.html', o anular la vista con' handler403' en el URLconf (consulte https://docs.djangoproject.com/en/1.7/topics/http/views/#customizing -error-views). Lamentablemente, no puede pasar un mensaje a través de la excepción y el contexto de la plantilla no se entrega la excepción sin formato a través del comportamiento integrado. Si desea mostrar un mensaje especial, deberá crear middleware. – jcampbelly

Cuestiones relacionadas