Django类视图中如何根据用户权限控制页面内容显示
Django 按权限控制编辑链接展示实现方案
核心实现逻辑
分两层做校验:第一层在视图层计算当前用户是否有编辑权限,把结果传给模板;模板根据这个参数决定是否渲染编辑链接;第二层加视图请求拦截,防止用户直接访问编辑地址绕过前端限制。
具体实现步骤
- 第一步:重写类视图的上下文传递方法,注入权限判断结果
你当前用的是UpdateView类视图,直接重写get_context_data方法即可,修改后的视图代码如下:
class CompanyProjectsDetailView(UpdateView): queryset = Project.objects.get_with_counted_notes_documents_todos() template_name = 'company_accounts/project_detail.html' context_object_name = 'project' form_class = ProjectStatusForm def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) current_user = self.request.user project = self.get_object() can_edit_project = False # 权限判断规则可根据业务自行调整,示例规则为:超级管理员/项目创建者拥有编辑权限 if current_user.is_authenticated: can_edit_project = current_user.is_superuser or (project.created_by == current_user) # 如果启用了Django内置权限体系,可追加权限判断 # can_edit_project = can_edit_project or current_user.has_perm('company_project.change_project') context['can_edit_project'] = can_edit_project return context # 加请求级权限拦截,避免直接访问编辑地址绕过限制 def dispatch(self, request, *args, **kwargs): project = self.get_object() current_user = request.user has_perm = False if current_user.is_authenticated: has_perm = current_user.is_superuser or (project.created_by == current_user) if not has_perm: from django.core.exceptions import PermissionDenied raise PermissionDenied("无项目编辑权限") return super().dispatch(request, *args, **kwargs)
- 第二步:修改模板文件,按权限判断是否渲染编辑链接
在你需要展示编辑链接的位置,用模板标签做判断,示例代码:
<!-- 原有项目详情展示代码 --> <h2>{{ project.title }}</h2> <div class="project-desc"> {{ project.description|safe }} </div> <p>项目状态:{{ project.get_status_display }}</p> <!-- 编辑链接区域,仅有权限时渲染 --> {% if can_edit_project %} <a href="{{ project.get_absolute_url }}edit/" class="btn btn-primary">编辑项目</a> {% endif %}
注意:模板层的判断只是控制元素展示,必须搭配视图层的
dispatch拦截,否则用户直接输入编辑页URL就能绕过隐藏的链接直接修改内容。
- (可选)调整权限规则
如果你的业务有更复杂的权限要求,比如项目成员、部门管理员也有编辑权限,只需要修改两处has_perm/can_edit_project的判断逻辑即可,其余代码不需要改动。
内容的提问来源于stack exchange,提问作者Finn
相关产品推荐
相关产品推荐

