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

Django模板中如何根据用户权限设置权限复选框选中状态

需求说明

在Django模板中实现用户权限编辑功能,要求复选框状态和用户实际持有权限匹配:

  • 用户拥有指定权限时,对应权限项的复选框默认选中
  • 用户未拥有该权限时,对应复选框默认未选中
    效果参考:
    权限编辑效果示意图

现有代码

视图层(View.py)

def EditUserView(request,id=0):
    user = User.objects.get(pk=id)
    permission = Permission.objects.all()
    return render(request,'edituser.html',{"userdata":user,"permissions":permission})

模板层(edituser.html)

<div class="table-wrapper">
        <table class="table">
            <thead>
                <tr>
                    <th>Permissions</th>
                    <th>Status</th>
                </tr>
            </thead>
            <tbody>
                
                {% for perm in permissions%}
                <tr>
                    <td id="perm">{{perm}}</td>
                    <td><input type="checkbox" name="status" id="status" onclick="ChangeUserPermissions(this,userid='{{userdata.id}}',permission='{{perm}}')"></td>
                </tr>
                {% endfor %}
            </tbody>
        </table>
    </div>
实现步骤

1. 修改视图逻辑

提前取出当前用户持有的所有权限ID,转成集合传递给模板,避免模板层执行复杂数据库查询:

def EditUserView(request,id=0):
    user = User.objects.get(pk=id)
    permissions = Permission.objects.all()
    # 取用户直接关联的权限ID
    user_perm_ids = set(user.user_permissions.values_list('id', flat=True))
    # 如果需要包含用户所属用户组的权限,替换成下面这段代码
    # from django.db.models import Q
    # user_perm_ids = set(Permission.objects.filter(
    #     Q(user=user) | Q(group__user=user)
    # ).values_list('id', flat=True).distinct())
    return render(request,'edituser.html',{
        "userdata":user,
        "permissions":permissions,
        "user_perm_ids": user_perm_ids
    })

2. 修改模板渲染逻辑

循环渲染权限项时,判断当前权限ID是否在用户持有的权限ID集合中,存在则给复选框加checked属性。
注意:原代码中循环生成的DOM元素使用固定id不符合HTML规范,id需全局唯一,这里移除了重复的固定id,同时建议传权限ID而非权限名称给前端方法,避免特殊字符导致传参异常
修改后的模板代码:

<div class="table-wrapper">
    <table class="table">
        <thead>
            <tr>
                <th>Permissions</th>
                <th>Status</th>
            </tr>
        </thead>
        <tbody>
            {% for perm in permissions%}
            <tr>
                <td>{{perm}}</td>
                <td>
                    <input 
                        type="checkbox" 
                        name="perm_status"
                        value="{{perm.id}}"
                        {% if perm.id in user_perm_ids %}checked{% endif %}
                        onclick="ChangeUserPermissions(this, userid='{{userdata.id}}', permission_id='{{perm.id}}')"
                    >
                </td>
            </tr>
            {% endfor %}
        </tbody>
    </table>
</div>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:54:33