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
相关产品推荐
相关产品推荐

