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

如何在Django模板中校验用户是否拥有对象删除权限

Django模板中校验用户组分配的删除权限实现方案

Django模板渲染时会自动注入全局权限变量perms,这个变量会自动汇总当前用户单独分配的权限、以及用户所属所有用户组继承的权限,不需要手动遍历用户组做判断,直接用它做条件判断即可。

  • 模型级删除权限校验(最常用场景,只要用户所在组拥有对应模型的删除权限就通过)
    假设你要校验的是blog应用下Post模型的删除权限,Django默认生成的删除权限标识为blog.delete_post,直接补全if判断即可:

    {% if perms.blog.delete_post %} 
        <button><a href="/delete">Delete</a></button>
    {% endif %}
    

    你需要把代码里的blog替换成你自己的应用名,post替换成对应模型的小写名称;如果你用的是自定义权限,把delete_post换成你自定义的权限codename即可。

  • 对象级删除权限校验(需要校验用户对当前具体数据实例是否有删除权限的场景)
    不建议把对象权限判断逻辑写在模板里,应该在视图层提前完成校验,把结果传递给模板:
    视图层示例代码:

    def post_detail(request, post_id):
        post = Post.objects.get(id=post_id)
        # 该行会自动校验用户自身权限、所属用户组权限、以及你配置的对象级权限规则
        can_delete = request.user.has_perm('blog.delete_post', post)
        return render(request, 'post_detail.html', {
            'post': post,
            'can_delete': can_delete
        })
    

    模板层直接使用传入的判断结果即可:

    {% if can_delete %} 
        <button><a href="/delete/{{ post.id }}">Delete</a></button>
    {% endif %}
    

避坑提示:不要在模板里写遍历user.groups匹配组名的判断逻辑,这种写法和权限配置强耦合,后续调整用户组、修改组权限的时候需要同步修改所有相关模板,维护成本极高。用Django原生的权限校验接口,后续不管是调整组权限、加单独用户权限、加对象级权限,都不需要修改模板层的判断逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 10:15:38