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
相关产品推荐
相关产品推荐

