You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django使用PermissionRequiredMixin时不跳转403页展示权限提示如何实现?

这个需求完全可以实现,问题出在你没有正确重写PermissionRequiredMixin的权限失败处理逻辑。

你之前重写的get_permission_denied_message方法仅用来返回权限拒绝的提示文本,本身不负责处理跳转逻辑,所以修改它无法实现留在原页面的需求。PermissionRequiredMixin在权限校验失败时,会调用handle_no_permission方法处理后续逻辑,你只需要重写这个方法实现自定义跳转即可。

修正后的完整代码

from django.contrib import messages
from django.shortcuts import redirect
from django.views.generic.edit import DeleteView
from django.contrib.auth.mixins import PermissionRequiredMixin, SuccessMessageMixin
from django.urls import reverse_lazy, HttpResponseRedirect

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 handle_no_permission(self):
        messages.error(self.request, self.permission_denied_message)
        # 重定向回文档详情页(原页面)
        return redirect('slatedoc-detail', pk=self.get_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())

注意事项

  • 确保你的页面模板中已经添加了messages提示的渲染代码,否则消息无法正常展示,模板示例如下:
{% if messages %}
{% for message in messages %}
<div class="alert alert-{{ message.tags }}">
  {{ message }}
</div>
{% endfor %}
{% endif %}
  • PermissionRequiredMixin的权限校验会在delete方法执行前完成,你不需要在delete方法中手动判断权限。

内容的提问来源于stack exchange,提问作者stevec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:54:03