Django 如何使用CBV将PermissionDenied重定向到另一个页面?

Django 如何使用CBV将PermissionDenied重定向到另一个页面?,django,django-models,django-forms,django-views,Django,Django Models,Django Forms,Django Views,我有一个具有权限的模型,在使用CBV(generic.CreateView)或(generic.DetailView)的视图中,如果登录的用户有权限,他可以访问该视图,如果没有访问权限,则显示页面禁止403 但是,如果用户没有该视图的权限,我希望引发异常PermissionDenied,并针对此错误重定向到特定页面 我的看法是: class AddJob(LoginRequiredMixin, PermissionRequiredMixin, generic.CreateView) pe

我有一个具有权限的模型,在使用CBV(generic.CreateView)或(generic.DetailView)的视图中,如果登录的用户有权限,他可以访问该视图,如果没有访问权限,则显示页面禁止403

但是,如果用户没有该视图的权限,我希望引发异常PermissionDenied,并针对此错误重定向到特定页面

我的看法是:

class AddJob(LoginRequiredMixin, PermissionRequiredMixin, generic.CreateView)

   permission required = 'can_create_job'
   model = Job
   fields = ['name', 'description', 'salary']
   success_url = reversy_lazy('job_list)
   context_object_name = 'object_name'
有人能帮我吗?
谢谢

您可以添加
raise\u exception=True
来查看类,这将引发
PermissionDenied
,即返回403(禁止)http状态的响应。看


另外,如果您想显示自己的403页面,可以创建
403.html
模板,django将在返回403时使用它。请参见

首先,您不能同时执行重定向引发404异常

也就是说,如果用户没有权限,您可以重定向到某个页面,或者引发异常。

案例1:引发异常
要引发异常,您应该在视图类中添加
raise\u exception=True
,作为,

class AddJob(LoginRequiredMixin, PermissionRequiredMixin, generic.CreateView):
    permission_required = 'can_create_job'
    model = Job
    fields = ['name', 'description', 'salary']
    success_url = reversy_lazy('job_list')
    context_object_name = 'object_name'
    raise_exception = True # Change is here


如果同时设置
login\u url
raise\u exception
,会发生什么情况?
该类有一个被调用以处理此条件的方法。

def handle_no_权限(self):
如果self.raise\u异常:
提升权限被拒绝(self.get\u权限被拒绝\u消息())
返回重定向到登录(self.request.get\u full\u path()、self.get\u login\u url()、self.get\u redirect\u field\u name())

在这里,您可以看到,如果设置<强> > RaSeeExealExt=“/>代码> ,<强> > django不会考虑<代码> LogiNURL< /Calp><强> > /p>可以为消息403创建一个指定HTML吗?比如,“no_permission.html”,并设置为login_url='no_permission.html'?是的,它的工作。我创建了一个403.html文件,并将我关于PermissionDenied页面的信息放入其中,我使用raise_exception=True。非常感谢我的朋友。@Matheussares-我正在尝试第二个选项,但无法理解最后一部分,即
登录\u url
。如何使页面显示自定义消息。谢谢,它能用了。但是,无法将权限值作为上下文发送到模板。有什么建议吗?Django中有一定的指导,但不确定如何使用它。这两种语言都适用。raise_exception=True,我创建了403.html文件,并将有关PermissionDenied的信息放入其中。非常感谢我的朋友。
class AddJob(LoginRequiredMixin, PermissionRequiredMixin, generic.CreateView):
    permission_required = 'can_create_job'
    model = Job
    fields = ['name', 'description', 'salary']
    success_url = reversy_lazy('job_list')
    context_object_name = 'object_name'
    login_url = '/path/to/specific/page'
def handle_no_permission(self):
    if self.raise_exception:
        raise PermissionDenied(self.get_permission_denied_message())
    return redirect_to_login(self.request.get_full_path(), self.get_login_url(), self.get_redirect_field_name())