Django Admin ModelChoiceField选项报错及PlaceSection筛选异常求解
问题排查与修复方案
一、原Admin保存报错根因(供参考)
之前Admin侧抛出「Select a valid choice」错误的核心问题有两个:
ModelChoiceField的第一个参数要求传入模型实例查询集,你传入的PlaceSection.objects.values()返回的是字典类型的查询集,和字段要求的类型不匹配- 表单字段名和Meta中声明的字段名不一致:你定义的表单字段是
place_sections,但Meta的fields列表中写的是place_section,少了结尾的s,导致表单提交的字段值无法和模型字段对应
二、当前搜索页TypeError修复方案
你遇到的'PlaceSection' object is not iterable错误,出现在query.py的过滤逻辑中:
你在循环里使用了place_sections__in=section,这里的section是遍历得到的单个PlaceSection实例,而__in查询要求右侧必须传入可迭代对象(列表、查询集等),直接传单个实例就会触发不可迭代报错。
同时你的过滤逻辑冗余,完全不需要循环拼接查询集、调用intersection,直接用表单返回的选中列表过滤即可,修改后的filter_query函数如下:
# query.py def filter_query(form): query = Institution.objects.all() selected_sections = form.cleaned_data["place_sections"] if selected_sections: # 直接用选中的PlaceSection列表过滤,无需循环 query = query.filter(place_sections__in=selected_sections) return query
如果你的Institution模型和PlaceSection是外键/多对多关联,关联字段名就是place_sections的话,上面的代码可以直接正常运行,不会再抛出类型错误。
内容的提问来源于stack exchange,提问作者piah
相关产品推荐
相关产品推荐

