2010-08-10 85 views
5

我已经添加了这个装饰,以我的观点一个Django permission_required错误消息?

@permission_required('codename') 

当用户访问该网页并没有所需的权限,他将被重定向登录页面,但它并没有真正告诉他为什么他被重定向到那里。更糟的是,如果他登录,并且仍然没有权限,他将完全无法知道他为什么不能访问该页面!

是不是有一种方法可以利用消息框架并同时发布错误?

+3

看起来像是重复的http://stackoverflow.com/questions/1251151/how-can-make-django-permission-required-decorator-not-to-redirect-already-logged – 2010-08-10 17:08:45

回答

1

可以敲入消息框架并提供错误消息。请参阅my answer以得到相同的问题。

2

您可以在此装饰器中使用login_url参数重定向到其他页面,而不是登录页面。或者你也可以根据从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) 

简单地改变login_url一些redirect_to,并不会造成任何混乱。

2

使用@permission_required_or_403('codename')

这将用户重定向到一个403“权限被拒绝”的错误页面。

+0

这个装饰器没有在Django文档 – 2012-09-18 14:47:33

3

不知道你正在使用的,但在Django 1.4是什么版本的Django的更高,你可以使用:

from django.contrib.auth.decorators import permission_required 

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

这将引发403例外,如果你的基地有一个403.html页面你的模板文件夹,它将服务器了。

如果你正在使用基于类的观点:

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 

希望这有助于。