世界资讯:组合搜索组件文档
(资料图片)
search_group = NbSearchGroup( request, models.TransactionRecord, # 传入表 Option("charge_type"), # 传入choice字段名)
第二步: 添加查询条件# 查询条件 .filter(**search_group.get_condition)queryset = models.TransactionRecord.objects.filter(q).filter(**search_group.get_condition).filter( customer_id=request.user_obj.id, active=1).order_by( "-id")
第三步: 向html中传递参数context = { "show_data": pager.show_data, "pager_string": pager.html(), "keyword": keyword, "search_group": search_group # 这是需要添加的}return render(request, "transaction_list.html", context)
第四步: 导入html search_group.html
{% if search_group.get_row_list %} 快速筛选 {% for row in search_group.get_row_list %} {% for obj in row %} {{ obj|safe }} {% endfor %} {% endfor %} {% endif %}
第五步: 导入css(最好放到static静态文件中) search_group.css
.search-group { padding: 5px 10px;}.search-group .row .whole { width: 60px; float: left; display: inline-block; padding: 5px 0 5px 8px; margin: 3px; font-weight: bold; text-align: right;}.search-group .row .others { padding-left: 80px;}.search-group .row a { display: inline-block; padding: 5px 8px; margin: 3px; border: 1px solid #d4d4d4;}.search-group .row a { display: inline-block; padding: 5px 8px; margin: 3px; border: 1px solid #d4d4d4;}.search-group a.active { color: #fff; background-color: #337ab7; border-color: #2e6da4;}
第六步: 导入核心代码(源码)group.py
# -*- encoding:utf-8 -*-# @time: 2023/4/14 21:03# @author: Maxs_hufrom django.db.models import ForeignKey, ManyToManyFieldclass SearchGroupRow(object): def __init__(self, title, queryset_or_tuple, option, query_dict): """ :param title: 组合搜索的列名称 :param queryset_or_tuple: 组合搜索关联获取到的数据 :param option: 配置 :param query_dict: request.GET """ self.title = title self.queryset_or_tuple = queryset_or_tuple self.option = option self.query_dict = query_dict def __iter__(self): yield "" yield self.title yield "" yield "" total_query_dict = self.query_dict.copy() total_query_dict._mutable = True origin_value_list = self.query_dict.getlist(self.option.field) if not origin_value_list: yield "全部" % total_query_dict.urlencode() else: total_query_dict.pop(self.option.field) yield "全部" % total_query_dict.urlencode() for item in self.queryset_or_tuple: text = self.option.get_text(item) value = str(self.option.get_value(item)) query_dict = self.query_dict.copy() query_dict._mutable = True if not self.option.is_multi: query_dict[self.option.field] = value if value in origin_value_list: query_dict.pop(self.option.field) yield "%s" % (query_dict.urlencode(), text) else: yield "%s" % (query_dict.urlencode(), text) else: # {"gender":["1","2"]} multi_value_list = query_dict.getlist(self.option.field) if value in multi_value_list: multi_value_list.remove(value) query_dict.setlist(self.option.field, multi_value_list) yield "%s" % (query_dict.urlencode(), text) else: multi_value_list.append(value) query_dict.setlist(self.option.field, multi_value_list) yield "%s" % (query_dict.urlencode(), text) yield ""class Option(object): def __init__(self, field, is_condition=True, is_multi=False, db_condition=None, text_func=None, value_func=None): """ :param field: 组合搜索关联的字段 :param is_multi: 是否支持多选 :param db_condition: 数据库关联查询时的条件 :param text_func: 此函数用于显示组合搜索按钮页面文本 :param value_func: 此函数用于显示组合搜索按钮值 """ self.field = field self.is_condition = is_condition self.is_multi = is_multi if not db_condition: db_condition = {} self.db_condition = db_condition self.text_func = text_func self.value_func = value_func self.is_choice = False def get_db_condition(self, request, *args, **kwargs): return self.db_condition def get_queryset_or_tuple(self, model_class, request, *args, **kwargs): """ 根据字段去获取数据库关联的数据 :return: """ # 根据gender或depart字符串,去自己对应的Model类中找到 字段对象 field_object = model_class._meta.get_field(self.field) title = field_object.verbose_name # 获取关联数据 if isinstance(field_object, ForeignKey) or isinstance(field_object, ManyToManyField): # FK和M2M,应该去获取其关联表中的数据: QuerySet db_condition = self.get_db_condition(request, *args, **kwargs) return SearchGroupRow(title, field_object.remote_field.model.objects.filter(**db_condition), self, request.GET) else: # 获取choice中的数据:元组 self.is_choice = True return SearchGroupRow(title, field_object.choices, self, request.GET) def get_text(self, field_object): """ 获取文本函数 :param field_object: :return: """ if self.text_func: return self.text_func(field_object) if self.is_choice: return field_object[1] return str(field_object) def get_value(self, field_object): if self.value_func: return self.value_func(field_object) if self.is_choice: return field_object[0] return field_object.pk def get_search_condition(self, request): if not self.is_condition: return None if self.is_multi: values_list = request.GET.getlist(self.field) # tags=[1,2] if not values_list: return None return "%s__in" % self.field, values_list else: value = request.GET.get(self.field) # tags=[1,2] if not value: return None return self.field, valueclass NbSearchGroup(object): def __init__(self, request, model_class, *options): self.request = request self.model_class = model_class self.options = options def get_row_list(self): row_list = [] for option_object in self.options: row = option_object.get_queryset_or_tuple(self.model_class, self.request) row_list.append(row) return row_list @property def get_condition(self): """ 获取组合搜索的条件 :param request: :return: """ condition = {} # ?depart=1&gender=2&page=123&q=999 for option in self.options: key_and_value = option.get_search_condition(self.request) if not key_and_value: continue key, value = key_and_value condition[key] = value return condition
3. 分享源码实现和封装from django.db.models import ForeignKey, ManyToManyFieldclass SearchGroupRow(object): def __init__(self, title, queryset_or_tuple, option, query_dict): """ :param title: 组合搜索的列名称 :param queryset_or_tuple: 组合搜索关联获取到的数据 :param option: 配置 :param query_dict: request.GET """ self.title = title self.queryset_or_tuple = queryset_or_tuple self.option = option self.query_dict = query_dict def __iter__(self): yield "" yield self.title yield "" yield "" total_query_dict = self.query_dict.copy() total_query_dict._mutable = True origin_value_list = self.query_dict.getlist(self.option.field) if not origin_value_list: yield "全部" % total_query_dict.urlencode() else: total_query_dict.pop(self.option.field) yield "全部" % total_query_dict.urlencode() for item in self.queryset_or_tuple: text = self.option.get_text(item) value = str(self.option.get_value(item)) query_dict = self.query_dict.copy() query_dict._mutable = True if not self.option.is_multi: query_dict[self.option.field] = value if value in origin_value_list: query_dict.pop(self.option.field) yield "%s" % (query_dict.urlencode(), text) else: yield "%s" % (query_dict.urlencode(), text) else: # {"gender":["1","2"]} multi_value_list = query_dict.getlist(self.option.field) if value in multi_value_list: multi_value_list.remove(value) query_dict.setlist(self.option.field, multi_value_list) yield "%s" % (query_dict.urlencode(), text) else: multi_value_list.append(value) query_dict.setlist(self.option.field, multi_value_list) yield "%s" % (query_dict.urlencode(), text) yield ""class Option(object): def __init__(self, field, is_condition=True, is_multi=False, db_condition=None, text_func=None, value_func=None): """ :param field: 组合搜索关联的字段 :param is_multi: 是否支持多选 :param db_condition: 数据库关联查询时的条件 :param text_func: 此函数用于显示组合搜索按钮页面文本 :param value_func: 此函数用于显示组合搜索按钮值 """ self.field = field self.is_condition = is_condition self.is_multi = is_multi if not db_condition: db_condition = {} self.db_condition = db_condition self.text_func = text_func self.value_func = value_func self.is_choice = False def get_db_condition(self, request, *args, **kwargs): return self.db_condition def get_queryset_or_tuple(self, model_class, request, *args, **kwargs): """ 根据字段去获取数据库关联的数据 :return: """ # 根据gender或depart字符串,去自己对应的Model类中找到 字段对象 field_object = model_class._meta.get_field(self.field) title = field_object.verbose_name # 获取关联数据 if isinstance(field_object, ForeignKey) or isinstance(field_object, ManyToManyField): # FK和M2M,应该去获取其关联表中的数据: QuerySet db_condition = self.get_db_condition(request, *args, **kwargs) return SearchGroupRow(title, field_object.remote_field.model.objects.filter(**db_condition), self, request.GET) else: # 获取choice中的数据:元组 self.is_choice = True return SearchGroupRow(title, field_object.choices, self, request.GET) def get_text(self, field_object): """ 获取文本函数 :param field_object: :return: """ if self.text_func: return self.text_func(field_object) if self.is_choice: return field_object[1] return str(field_object) def get_value(self, field_object): if self.value_func: return self.value_func(field_object) if self.is_choice: return field_object[0] return field_object.pk def get_search_condition(self, request): if not self.is_condition: return None if self.is_multi: values_list = request.GET.getlist(self.field) # tags=[1,2] if not values_list: return None return "%s__in" % self.field, values_list else: value = request.GET.get(self.field) # tags=[1,2] if not value: return None return self.field, value
4. 分享案例优点:
可根据传入的字段名读取表中choice并展示和实现对应的筛选功能大多数项目可以应用上思路(django中admin的源码以及stark组件)关键词:
责任编辑:宋璟
-
世界资讯:组合搜索组件文档
-
今日热文:2023年危废无害化概念龙头上市公司汇总(4/14)
-
业绩快报:ST天润全年亏损2.3亿
-
共赴开放之约 海口江东新区园区企业亮相消博会[图]
-
焦点日报:微信:已通报批评处罚负责人,将扎实推进平台的安全稳定运行
-
2023年烧烤市场分析:亚太地区占据全球烧烤市场主要份额
-
渡远户外IPO:2022年营收净利双降 创业板定位屡遭质疑-天天热文
-
永嘉集团:高级时装零售业务的实体店铺第一季度同店销售增长率约为22%
-
上海第九整形美容医院怎么样?医生介绍/手术收费、挂号预约一览_世界讯息
-
当前视讯!解剖屎山,寻觅黄金之第二弹
-
利亚德:利晶公司产能今年底前将扩产到2000KK/月
-
天天观天下!国家卫健委:全国已设置76个国家区域医疗中心
-
2021海南定安县招聘事业单位工作人员公告十二
-
主人杯是什么意思 主人杯指的是什么呢-快资讯
-
玉林警方复盘侦破系列入室盗窃案 追缴茅台酒49瓶
-
通讯!MAT队服 MAT队
-
太快了!这家公司将让AI“入侵”创意行业?
-
当前快报:以“能力范式”为引领 推进教师教育能力建设
-
每日头条!农业银行县域贷款余额达7.3万亿元
-
关于Python字典(Dictionary)操作详解_环球速递
-
LG K61 K51S和K41S将四个相机带到中档_全球速看料
-
世界今日讯!在这条公路上行驶的最高速度不能超过多少?120_在这条公路上行驶的最高速度不能超过多少110
-
世界观点:大亚圣象:公司目前没有扩张计划,以地板和人造板两大主业为核心
-
win7打开摄像头图标_win7打开摄像头|前沿资讯
-
IPO速递|晶合集成2023年4月20日开启申购,你要打吗? 全球球精选
-
科普大篷车开进长沙县中南小学
-
穆里尼奥计划离开罗马!考虑去2大豪门,对去沙特执教C罗不感兴趣
-
自如熊林:如何用三年时间推动公司内核“质”变_环球速看
-
【天天新要闻】甘李药业(603087)4月13日主力资金净买入2207.54万元
-
当前热文:瑞信:维持腾讯(00700)“跑赢大市”评级 目标价461港元
-
世界速递!洁美科技(002859)公司点评:景气复苏进行时 业绩回暖可期
-
郑州市升龙社区开展“人大代表接待选民日”活动|环球看点
-
【乐天派】快乐8第23093期预测 胆码详解|新消息
-
“快递偷重”凸显行业乱象 行业需要摆脱粗放式发展模式|每日看点
-
全球信息:春日里的“美丽经济”:新业态给村里带来新活力