Django模板展示.all()查询集列表时实现单行数据更新的方案咨询
解决方案
1. 调整视图逻辑
你不需要额外配置带pk的路径参数,直接通过POST参数传递要更新的用户ID即可,修改后的视图代码如下:
def permissions(request): users = User.objects.all() forms_list = [] if request.method == "POST": # 从POST参数中取待更新的用户ID user_id = request.POST.get("user_id") target_user = User.objects.get(id=user_id) # 绑定提交数据和对应的用户实例 form = PermissionsForm(request.POST, instance=target_user) if form.is_valid(): form.save() # 重定向回当前页面,刷新后展示所有最新的行数据 return redirect('permissions') for user in users: forms_list.append({'user': user, 'form': PermissionsForm(instance=user, label_suffix='')}) context = { 'forms': forms_list, } return render(request, 'useradmin/permissions.html', context)
2. 调整模板结构
每行对应的表单里添加隐藏的user_id字段,同时每个表单单独加csrf_token,示例结构如下:
<table> {% for item in forms %} <form method="post"> {% csrf_token %} <!-- 隐藏字段传递当前行的用户ID --> <input type="hidden" name="user_id" value="{{ item.user.id }}"> <tr> <!-- 渲染表单字段,比如权限相关的输入项 --> <td>{{ item.form.permission_field1 }}</td> <td>{{ item.form.permission_field2 }}</td> <td><button type="submit">保存修改</button></td> </tr> </form> {% endfor %} </table>
方案说明
- 所有表单的提交地址默认就是当前页面的URL,不需要额外配置带ID的路径
- 提交后通过POST参数里的
user_id定位要更新的行,不会影响其他行的数据 - 保存完成后重定向回当前视图,会重新拉取全量用户权限数据,展示的就是更新后的所有行结果,完全符合需求。
内容的提问来源于stack exchange,提问作者Avichayil Geller
相关产品推荐
相关产品推荐

