Django中如何控制UpdateView继承页面仅超级用户、教师可访问
Django UpdateView 权限控制实现方案
你可以通过以下两种方式实现仅超级用户和教师角色可访问页面的需求:
方法一:使用UserPassesTestMixin(官方推荐)
利用Django内置的权限校验混入类实现,代码可读性更高:
- 首先在
views.py中导入依赖 - 修改视图类继承逻辑,添加权限校验和无权限处理方法
from django.contrib.auth.mixins import UserPassesTestMixin from django.shortcuts import redirect # 注意:UserPassesTestMixin 必须放在继承顺序的第一位,否则权限校验会失效 class Edit_news(UserPassesTestMixin, UpdateView): model = News form_class = edit_NewsForm template_name = "profile/Edit_news.html" # 自定义权限校验规则 def test_func(self): current_user = self.request.user # 此处假设你的用户模型角色字段为role,教师对应的取值为'teacher',可根据实际业务调整 return current_user.is_superuser or current_user.role == 'teacher' # 如果你的角色是通过Django组管理,可替换为下方逻辑: # return current_user.is_superuser or current_user.groups.filter(name='教师').exists() # 无权限时重定向到404页面 def handle_no_permission(self): return redirect('/404')
方法二:重写dispatch方法
如果不想用混入类,可直接重写视图的请求入口方法实现:
from django.shortcuts import redirect class Edit_news(UpdateView): model = News form_class = edit_NewsForm template_name = "profile/Edit_news.html" def dispatch(self, request, *args, **kwargs): current_user = request.user # 权限校验逻辑和上方一致,可根据实际调整 if not (current_user.is_superuser or current_user.role == 'teacher'): return redirect('/404') # 校验通过才执行后续的视图逻辑 return super().dispatch(request, *args, **kwargs)
补充说明
- 如果你不需要重定向,想要直接返回标准404状态页,可将
redirect('/404')替换为raise Http404(),需要提前导入依赖:from django.http import Http404 - 原有
urls.py的路由配置不需要做任何修改,直接使用即可生效
内容的提问来源于stack exchange,提问作者A.b.Ramazani
相关产品推荐
相关产品推荐

