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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:36:03