- django有个choiceselect ,可以配置为select2模式。但是模式比较单一,下拉表只显示名称一个字段,有时需要显示为 [一级|二级]这种。还有个需求,例如我建了一个字典表,想在不同的页面中显示不同类别的下拉。
1.最好的是重写class AutocompleteJsonView下的方法。但是重写后我没找到在哪注册、在哪调用我重写的方法。
2.又鸡贼了。直接修改虚拟环境下的django中的class AutocompleteJsonView
#在get里实现字典类别筛选
def get(self, request, *args, **kwargs):
(
self.term,
self.model_admin,
self.source_field,
to_field_name,
) = self.process_request(request)
if not self.has_perm(request):
raise PermissionDenied
if 'dic' in self.source_field.name:#自己数据库字段命名带点儿规则,又dic出现的就是字典字段
tt = self.source_field.name[4:]#字典字段的后半部分对应字典中定义的type字段,用来筛选
self.object_list = self.get_queryset().filter(type=tt)
else:
self.object_list = self.get_queryset()#不是字典就不筛选了
context = self.get_context_data()
return JsonResponse(
{
"results": [
self.serialize_result(obj, to_field_name)
for obj in context["object_list"]
],
"pagination": {"more": context["page_obj"].has_next()},
}
)
#在serialize_result里实现 [一级|二级]字段拼接
def serialize_result(self, obj, to_field_name):
txt = str(obj)
if self.source_field.name in ('room','current_room','from_room','to_room'):
txt = txt+' | '+str(obj.building.name)
if self.source_field.name == 'user':
txt = txt+' | '+str(obj.username)
if self.source_field.name == 'device':
txt = txt+' | '+str(obj.ip)
return {"id": str(getattr(obj, to_field_name)), "text": txt}
网友评论