2010-08-10 39 views
5

He añadido este decorador a uno de mis puntos de vistaDjango permission_required mensaje de error?

@permission_required('codename') 

Cuando un usuario visita esa página y no tiene los permisos requeridos, es redirigido a la página de inicio de sesión, pero en realidad no decirle por qué ha sido redirigido allí. Peor aún, si inicia sesión, y aún no tiene los permisos, ¡no tendrá ni idea de por qué no puede acceder a esa página!

¿Hay alguna forma de que pueda acceder al marco de mensajes y publicar un error al mismo tiempo?

+3

Parece un duplicado de http://stackoverflow.com/questions/1251151/how-can-make-django-permission-required-decorator-not-to-redirect-already-logged –

Respuesta

1

Usted puede del grifo en el marco de mensajes y proporcionar un mensaje de error. Ver my answer a una pregunta idéntica.

2

Se puede utilizar el parámetro login_url en este decorador para redirigir a otra página, en lugar de la página de inicio de sesión. O simplemente puede escribir su propio decorador basado en el código de Django:

def permission_required(perm, login_url=None): 
    """ 
    Decorator for views that checks whether a user has a particular permission 
    enabled, redirecting to the log-in page if necessary. 
    """ 
    return user_passes_test(lambda u: u.has_perm(perm), login_url=login_url) 

basta con cambiar login_url hasta cierto redirect_to y no va a causar ninguna confusión.

2

Uso @permission_required_or_403('codename')

Esto redirigir a los usuarios a un 403 'permiso denegado' página de error.

+0

Este decorador no se encuentra en los documentos de Django –

3

No está seguro de qué versión de Django está utilizando, pero en Django 1.4 y más alto se puede utilizar:

from django.contrib.auth.decorators import permission_required 

@permission_required('app.permission',raise_exception=True) 
def myView(request): 
    #your view code 

Esto provocará una excepción 403 y si usted tiene una página 403.html en la base de su carpeta de plantilla lo solucionará.

Si está utilizando vistas a base de clase:

from django.views.generic.base import View 
from django.contrib.auth.decorators import permission_required 
from django.utils.decorators import method_decorator 

class MyView(View): 

    @method_decorator(permission_required('app.permission',raise_exception=True) 
    def get(self, request): 
     #your GET view 

Espero que esto ayude.

Cuestiones relacionadas