美文网首页
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