【问题标题】:Django - PermissionRequiredMixin - Return a 'permission_denied_message' in current View, instead of a 403 Page?Django - PermissionRequiredMixin - 在当前视图中返回“permission_denied_message”,而不是 403 页面?
【发布时间】:2021-11-21 17:52:57
【问题描述】:
Django version 3.0.5

我想在我的视图中使用PermissionRequiredMixin 来显示 与SuccessMessageMixin 相同的横幅消息。

例如,如果用户试图删除一个对象并且他们没有权限, permission_denied_message 本质上将被视为错误消息 在当前视图中显示为横幅消息。

这可能吗?

我目前拥有的代码不起作用 - 它总是重定向到 403 页面。 见下文:

class DocDeleteView(PermissionRequiredMixin, SuccessMessageMixin, DeleteView):
    model = SlateDoc
    success_url = reverse_lazy('slatedoc-list')
    success_message = "SlateDoc was deleted!"

    permission_required = ('slatedoc.delete_slatedoc')
    raise_exception = True
    permission_denied_message = "Permission Denied"

    def delete(self, request, *args, **kwargs):
        if self.has_permission() is False: 
            messages.error(self.request, self.permission_denied_message)
        else: 
            self.object = self.get_object()
            self.object.soft_delete()
            messages.success(self.request, self.success_message)
            return HttpResponseRedirect(self.get_success_url())

================================================ =======================

2021-10-07

所以我稍微更新了我的代码,现在我可以显示“权限被拒绝”错误消息,但它仍然重定向到 403 页面。 因此,我在 403 页面顶部看到一条红色错误消息。 仍在尝试弄清楚如何显示错误消息 在同一个视图上,没有重定向到 403 页面。

class DocDeleteView(PermissionRequiredMixin, SuccessMessageMixin, DeleteView):
    model = SlateDoc
    success_url = reverse_lazy('slatedoc-list')
    success_message = "SlateDoc was deleted!"

    permission_required = ('slatedoc.delete_slatedoc')
    raise_exception = False
    permission_denied_message = "Permission Denied"

    def get_permission_denied_message(self):
        self.object = self.get_object()
        messages.error(self.request, self.permission_denied_message)
        return reverse('slatedoc-detail', kwargs={'pk': self.object.pk})

    def delete(self, request, *args, **kwargs):
        self.object = self.get_object()
        self.object.soft_delete()
        messages.success(self.request, self.success_message)
        return HttpResponseRedirect(self.get_success_url())

【问题讨论】:

  • PermissionRequiredMixin 要么允许访问,要么禁止访问(403 状态码)。要实现您的目标,请跳过在您的视图中使用它(就像您正在做的那样) - 添加错误消息后不要忘记返回重定向或渲染。
  • 抱歉,我不明白 - “跳过使用它”是什么意思?如果我不使用 PermissonRequiredMixin,我如何知道用户是否有权执行该操作或访问视图?

标签: python-3.x django django-views django-3.0


【解决方案1】:

对于任何感兴趣的人: 这是我用来让它工作的代码。 @hendrikschneider 是对的 - 我只需要删除 PermissionRequiredMixin

class DocDeleteView(SuccessMessageMixin, DeleteView):
    model = SlateDoc
    success_url = reverse_lazy('slatedoc-list')
    success_message = "SlateDoc was deleted!"

    permission_required = ('slatedoc.delete_slatedoc')
    permission_denied_message = "Permission Denied"

    def delete(self, request, *args, **kwargs):
        if not request.user.has_perm(permission_required):
            self.object = self.get_object()
            messages.error(self.request, self.permission_denied_message)
            return redirect(reverse('slatedoc-detail', kwargs={'pk': self.object.pk}))
        else:
            self.object = self.get_object()
            self.object.soft_delete()
            messages.success(self.request, self.success_message)
            return HttpResponseRedirect(self.get_success_url())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 2020-11-19
    • 2017-07-06
    • 2016-07-25
    • 2017-11-17
    • 2018-10-10
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多