• list页面-按照choice筛选丶传condition过滤筛选项丶筛选与显示同步


    1.list页面:筛选功能优化,显示choices,传condition过滤筛选项
    list_filter = [
        # sites.FilterOption("name",False,lambda x:x.name,lambda x:x.name),#这种配置无意义
        sites.FilterOption("consultant",False,condition=Q(depart=1)),#传条件以显示筛选项
        sites.FilterOption("gender",False),#choices
    ]
    显示choices主要逻辑:如果_field.choices有值,就把_field.choices当做data_list送上去显示,而condition筛选则是不似以前无脑all()将表中对象全部显示.
    def gen_list_filter(self):
     
        for option in self.model_config.list_filter:
     
            if option.is_func:
                data_list = option.field_or_func(self.model_config,self,option)
            else:
                _field = self.model_config.model_class._meta.get_field(option.field_or_func)
     
                if isinstance(_field, ForeignKey):
                    data_list = FilterRow(option, self, _field.rel.model.objects.filter(option.get_condition), self.model_config.request.GET)
                elif isinstance(_field, ManyToManyField):
                    data_list = FilterRow(option, self, _field.rel.model.objects.filter(option.get_condition), self.model_config.request.GET)
                elif hasattr(_field,"choices") and _field.choices:
                    # print(_field.choices) #((1, '男'), (2, '女'))
                    data_list = FilterRow(option, self, _field.choices, self.model_config.request.GET,is_choices=True)
                else:
                    data_list = FilterRow(option, self, _field.model.objects.filter(option.get_condition), self.model_config.request.GET)
     
            yield data_list
     
    option.get_condition:
    @property
    def get_condition(self):
        if self.condition:
            return self.condition
        else:
            return Q()

    2.list页面筛选与显示同步--后端获取搜索条件执行搜索返回--model_class._meta._get_fields()包含类中最全的字段.

    filter_condition:获取搜索条件
    @property
    def filter_condition(self):
        # filed1 = [i.name for i in self.model_class._meta.fields]
        # print(filed1)
        # print('------------------')
        #
        # filed2 = [i.name for i in self.model_class._meta.many_to_many]
        # print(filed2)
        # print('------------------')
     
        filed3 = [i.name for in self.model_class._meta._get_fields()]#包含的字段最全
        # print(filed3)
        # print('------------------')
     
        con = {}
        for in self.request.GET:
            if not in filed3:
                continue
            v = self.request.GET.getlist(k)
            k = "%s__in"%k
            con[k]=v
     
        return con
  • 相关阅读:
    SpringBoot启动报错 java.lang.NoClassDefFoundError: javax/validation/ValidationException
    Java String类创建对象问题
    Java代码执行顺序
    Java抽象类与接口(2) ------接口
    Java抽象类与接口(1) ------抽象类
    Manjaro kde2020 使用记录
    生活常用小插件
    技术汇总
    Vue中使用websocket的正确使用方法
    js封装一个websocket
  • 原文地址:https://www.cnblogs.com/jec1999/p/7747513.html
Copyright © 2020-2023  润新知