Django autocomplete

2023-12-18  本文已影响0人  wyude

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}
上一篇下一篇

猜你喜欢

热点阅读