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

Mat*_*res 4 django django-models django-forms django-views

我有一个具有我的权限的模型,在我的视图中使用 CBV(generic.CreateView) 或 (generic.DetailView),如果登录的用户有权限,他可以访问该视图,如果没有访问权限,则显示页面 Forbidden 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'
Run Code Online (Sandbox Code Playgroud)

谁能帮我?谢谢

JPG*_*JPG 6

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

也就是说,如果用户没有权限,您可以重定向到某个页面可以引发异常。情况 1:引发异常 要引发异常,您应该在视图类中添加为,


raise_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
Run Code Online (Sandbox Code Playgroud)

情况2:重定向到您视图中
设置的特定页面,login_url

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'
Run Code Online (Sandbox Code Playgroud)



如果同时设置login_url和会发生什么raise_exception

该类有一个被调用的AccessMixin方法来处理这种情况。handle_no_permission()

源代码

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())
Run Code Online (Sandbox Code Playgroud)

这里你可以看到,如果你设置了raise_exception = Truedjango将不会考虑login_url