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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:54:18