Django 如何使用CBV将PermissionDenied重定向到另一个页面?
我有一个具有权限的模型,在使用CBV(generic.CreateView)或(generic.DetailView)的视图中,如果登录的用户有权限,他可以访问该视图,如果没有访问权限,则显示页面禁止403 但是,如果用户没有该视图的权限,我希望引发异常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
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())