如何像使用ModelMultipleChoiceField一样使用ajax-select的AutoCompleteSelectMultipleField
报错原因
AutoCompleteSelectMultipleField原生设计未内置queryset属性,它的可选数据源默认通过提前注册的Lookup类提供,和Django原生ModelMultipleChoiceField的设计逻辑不同,因此直接调用queryset属性会抛出属性不存在的错误。
解决方案
方案一:扩展自定义字段类(完全兼容原有调用逻辑)
继承AutoCompleteSelectMultipleField新增queryset属性存储逻辑,原有调用queryset的代码不需要做任何修改,实现代码如下:
from ajax_select.fields import AutoCompleteSelectMultipleField class QuerySetSupportAutoCompleteMultipleField(AutoCompleteSelectMultipleField): def __init__(self, *args, queryset=None, **kwargs): # 新增queryset属性存储,和原生ModelMultipleChoiceField逻辑对齐 self.queryset = queryset super().__init__(*args, **kwargs)
Form中字段定义调整为自定义字段,传入对应参数即可:
# Form代码修改示例 people = QuerySetSupportAutoCompleteMultipleField( # 替换为你实际注册的Person对应lookup通道名称 channel="person_lookup", queryset=Person.objects.exclude(is_healthy=True).filter(death_date=None), # 其他原有参数保持不变 required=False )
修改完成后,你原有测试代码people_list = form.fields['people'].queryset.values_list('id')可以直接正常运行。
方案二:直接从Lookup类获取查询集(不需要修改字段定义)
如果不想自定义字段,也可以直接调用字段内置的get_lookup()方法拿到关联的Lookup实例,再获取对应查询集,测试代码修改如下:
# 测试代码修改示例 lookup_instance = form.fields['people'].get_lookup() people_list = lookup_instance.get_queryset().values_list('id')
注意:该方案要求你编写的对应Lookup类的
get_queryset方法返回的查询集和你预期的逻辑一致,否则拿到的结果会和之前ModelMultipleChoiceField的queryset结果有差异。
内容的提问来源于stack exchange,提问作者Amirali Esfandiari
相关产品推荐
相关产品推荐

