美文网首页
Django autocomplete

Django autocomplete

作者: wyude | 来源:发表于2023-12-18 17:42 被阅读0次
  • 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}

相关文章

网友评论

      本文标题:Django autocomplete

      本文链接:https://www.haomeiwen.com/subject/vqbagdtx.html