Django多对多关系查询:表单获取Size模型ID和属性值失败如何解决?
问题根因
Django 表单的多对多关联字段(默认对应ModelMultipleChoiceField类型)的value属性返回的是已选中项的主键值列表,并非Size模型的实例对象。你当前遍历的item本身就是主键值,没有id属性,所以输出为空。
解决方法
方案1:遍历全量尺码手动判断选中状态(推荐,兼容表单验证失败回显)
你的视图已经把全量可用尺码sizes = Size.objects.all()传入模板,直接遍历该集合,同时和表单选中值匹配即可实现自定义渲染:
{% for size in sizes %} <span> <input type="checkbox" name="size" id="size_{{ size.id }}" value="{{ size.id }}" {% if size.id|stringformat:"i" in form.size.value %}checked{% endif %}> <label for="size_{{ size.id }}">{{ size.size }}</label> </span> {% endfor %}
其中stringformat:"i"用于统一主键的类型,避免整数ID和表单返回的字符串ID匹配失败
方案2:视图传入已选中的尺码实例
如果仅需要渲染已选中的尺码,可在视图中补充查询当前产品关联的尺码集合:
def updateProduct(request, pk): # 原有代码保持不变 selected_sizes = product.size.all() return render(request, 'public/views/backend/product-update.html', { # 原有传参保持不变 'selected_sizes': selected_sizes })
模板直接遍历selected_sizes即可获取完整的Size实例属性:
{% for item in selected_sizes %} <span> <input type="checkbox" name="size" id="{{ item.id }}" value="{{ item.id }}" checked> <label for="{{ item.id }}">{{ item.size }}</label> </span> {% endfor %}
注意该方案仅展示已选中的尺码,不会展示未选中的可选尺码,仅适合特殊展示场景
内容的提问来源于stack exchange,提问作者Muhammad Amir
相关产品推荐
相关产品推荐

