Django通过HTML表格批量更新模型数据时出现dict无B_G_Results属性报错
错误产生原因
- 核心触发逻辑是你在代码中对Python字典类型的变量使用了点语法调用
B_G_Results属性:Python字典只支持dict['键名']或dict.get('键名')的取值方式,不支持点语法调用不存在的类属性。 - 常见场景:要么是你直接对
request.POST这个类字典对象调用了.B_G_Results,要么是你遍历的数据源是字典列表而非BGD模型实例列表,对单个字典元素调用了.B_G_Results属性。
修复方案
你可以按照以下逻辑实现批量更新功能:
1. 视图函数代码
from django.shortcuts import render, redirect from .models import BGD from django.contrib import messages def batch_update_bgd_active(request): if request.method == "POST": update_objs = [] # 遍历POST参数,筛选出带BGD记录ID的Is_Active参数 for param_key, param_val in request.POST.items(): if not param_key.startswith("active_"): continue # 提取记录ID bgd_id = param_key.split("_", 1)[1] try: bgd_record = BGD.objects.get(id=bgd_id) # 转换POST提交的字符串值为布尔类型 bgd_record.Is_Active = param_val in ("on", "1", "true") update_objs.append(bgd_record) except BGD.DoesNotExist: continue # 批量更新,仅修改Is_Active字段,性能远高于逐行save if update_objs: BGD.objects.bulk_update(update_objs, ["Is_Active"]) messages.success(request, f"成功更新{len(update_objs)}条记录") return redirect(request.path) # GET请求返回数据列表页 bgd_records = BGD.objects.all() return render(request, "bgd_list.html", {"bgd_records": bgd_records})
2. 前端HTML代码
<form method="post" action=""> {% csrf_token %} <table border="1"> <tr> <th>B_G_Results</th> <th>Is_Active状态</th> </tr> {% for record in bgd_records %} <tr> <td>{{ record.B_G_Results }}</td> <td> <input type="checkbox" name="active_{{ record.id }}" {% if record.Is_Active %}checked{% endif %}> </td> </tr> {% endfor %} </table> <button type="submit">批量更新激活状态</button> </form>
注意事项
- 禁止对
request.POST、表单cleaned_data这类字典/类字典结构使用点语法取值,必须用中括号或get方法。 - 如果使用FormSet处理批量表单,要先调用表单集的
is_valid()方法,再通过cleaned_data取校验后的值,不要直接操作未校验的原始数据。 - 布尔类型字段赋值前必须转换POST提交的字符串值,避免直接把字符串"False"赋值给字段导致永远为True的逻辑错误。
内容的提问来源于stack exchange,提问作者Alden Linn
相关产品推荐
相关产品推荐

