搜索相关,搜索的本质就是从数据库查询出来的数据过滤

用户自定义给出过滤条件joker.py

list_display = ('id','title','price',)
show_add_btn = True
model_form_class = BookModelForm # 自己定制 form

config类中就需要有如下代码

 # 搜索 方法
self.search_key = "q" 类属性 #====================================================搜索,注意字段的格式 以下是方法
show_search_form = False
def get_show_search_form(self): # 取决于用户自定义,是否显示
return self.show_search_form search_fields = [] # 用户自定义搜索字段,默认显示所有
def get_search_fields(self):
result = []
if self.search_fields:
result.extend(self.search_fields)
return result def get_search_condition(self): # 得到字段,还有用户输入的搜索字段,让他们去模糊匹配
key_word = self.request.GET.get(self.search_key) # 请求的 q 的值,类属性
search_fields = self.get_search_fields() # 用户 自己 传过来过滤的 字段 'title__contains','price',
condition = Q() # 利用Q 查询
condition.connector = 'or' # Q 或者查询
if key_word and self.show_search_form: # 有默认搜索值,并且前端开启页面
for field_name in search_fields: # 'title__contains','price',
condition.children.append((field_name,key_word)) # title=Q的值ORprice=Q的值
print(condition) return condition # 如果用户没有自定义,我们默认就是所有数据,没有任何的过滤信,将返回值给数据库FILTER就可以过滤条件
 # 搜索框 数据获取
queryset = self.model.objects.filter(self.get_search_condition()) # 过滤条件 cls = ChangList(self,queryset) # 另一个类
   changlist 下面的方法

  elf.show_search_form = config.get_show_search_form()   # 类属性
  self.search_form_val = config.request.GET.get(config.search_key,'')
  def head_list(self):
        # list_display = (checkbox,"id","title",edit,delete)

        # 处理表头,也就是第一行内容,如果数据库有verbose_name字段,就会拿到这个名称
head_list = []
print(self.list_display)
### [<function JokerConfig.checkbox at 0x104e4cea0>, 'id', 'title', <function JokerConfig.edit at 0x104e4cd90>, <function JokerConfig.delete at 0x104e4ce18>]
for i in self.list_display:
print(i) for field_name in self.list_display: # id title edit
if isinstance(field_name, str):
###### 字符串,肯定就是字段了,例如 title字段到这里,就会得到verbose_name名字,如果没有verbose_name那就是本身名称
verbox_name = self.model_class._meta.get_field(field_name).verbose_name
else:
print()
# checkbox edit走这里
verbox_name = field_name(self.config, is_header=True) ##### 判断是不是头
head_list.append(verbox_name)
if not self.list_display: #### 没有list_display
head_list = ['选择', self.model_class._meta.model_name.upper(), ] print('==head_list==', head_list) # ['ID', '书籍名称', 'op']
return head_list def body_list(self):
# 处理数据
data_list = self.page_list # 切分后数据
print('==data_list==', data_list) # <QuerySet [<Book: linux>, <Book: python>, <Book: go>]> new_data_list = [] # [[, 'linux', "<a href='1/chagnge'>edit</a>"], [, 'python', "<a href='2/chagnge'>edit</a>"], [, 'go', "<a href='3/chagnge'>edit</a>"]] for obj in data_list: # 每一个对象 obj obj obj obj 是每一本书籍
temp = [] if not self.list_display: # 没有dis_play,给予默认头,信息,显示对象
temp.append(self.config.checkbox(obj))
temp.append(obj)
else:
for field_name in self.list_display: # (checkbox,"id","title",edit,delete)
if isinstance(field_name, str):
var = getattr(obj, field_name) # 拿到对象相对应的字段的值
else:
var = field_name(self.config, obj) # 不是对象里面的字段,执行自己样式方法,但是我要把这个obj传过去,为了修改删除
temp.append(var) new_data_list.append(temp) print('==new_data_list==', new_data_list)
return new_data_list

批量删除,用户自定义批量选择项,自定义处理机制

  ####= ======= 批量 相关
show_actions = True
def multi_del(self, request):
checkid_list = request.POST.getlist('checkid') # 批量传过来的是 主键的 对象
# self.model.objects.filter(id__in=pk_list).delete() # model就是注册了的数据库
return HttpResponse('删除成功') multi_del.short_desc = "自定义批量删除" def multi_init(self, request):
checkid_list = request.POST.getlist('checkid')
return HttpResponse('初始化成功') multi_init.short_desc = "自定义批量初始化" actions = [multi_del, multi_init]

config类中就有了如下代码

#=========================================================action批量
show_actions = False
def get_show_actions(self): # 是否显示批量框
return self.show_actions def select_del(self,request): # 默认删除操作
checkid_list = request.POST.getlist('checkid') # 待删除数据
print('======')
# return render(request, 'joker/pi_view.html', locals())
return HttpResponse('默认删除成功') select_del.short_desc = '默认删除' actions = []
def get_actions(self):
default_actions = [self.select_del]
if self.actions: # 如果用户自定义有值
default_actions.extend(self.actions) #multi_del, multi_init
print('========',default_actions)
return default_actions
### action  类属性
self.actions = config.get_actions() # congi类里面有自定义函数传过来的函数地址
self.show_actions = config.get_show_actions()
  # 批量 显示
if request.method == 'POST' and self.get_show_actions(): # 有数据,开启显示,批量删除操作
func_name_str = request.POST.get('list_action') # 前端的SELECT的NAME属性的值,对应的是当前选中的是哪个函数
print('select',func_name_str)
action_func = getattr(self, func_name_str) # 通过选中的批量函数,利用反射获取
print(request.POST) #request里面包含了选中的数据信息,通过FORM提交
ret = action_func(request) # multi_del, multi_init select_DEL执行 if ret:
return ret

模拟admin组件自己开发stark组件之搜索和批量操作的更多相关文章

  1. 模拟admin组件自己开发stark组件之创建篇

    admin组件 admin组件为我们提供了针对django管理页面 我们先简短来看下django的admin组件的启动流程,注册流程,url匹配过程 启动注册 1. 扫描所有应用下的注册了应用中的ad ...

  2. 模拟admin组件自己开发stark组件之自定义list_display,反向解析url

    反向解析 在上一篇文章中,我们创建好了stark这个组件,一个应用一个表有四个默认的url,那么我们如何区别这些url,因为可能会有重复现象(本组件不会,因为前面拼接了应用名,表明,肯定唯一),概念请 ...

  3. 模拟admin组件自己开发stark组件之增删改查

    增删改查,针对视图 我们需要modelform来创建,可自动生成标签,我们还要考虑用户是不是自己定制,依然解决方法是,继承和重写 app01下的joker.py文件 class BookModelFo ...

  4. 在WePY中实现了小程序的组件化开发,组件的所有业务与功能在组件本身实现,组件与组件之间彼此隔离,上述例子在WePY的组件化开发过程中,A组件只会影响到A所绑定的myclick

    wepyjs - 小程序组件化开发框架 https://tencent.github.io/wepy/document.html#/?id=%e5%be%ae%e4%bf%a1%e5%b0%8f%e7 ...

  5. 10.18正式开发stark组件*(三)

    2018-10-18 19:15:54 等这个stark组件做完了再上传到github上面,然后再整理博客!这就到周末啦! 因为models导入的时候出现bug,所以只有源码没有测试数据! 源码都有注 ...

  6. Agile.Net 组件式开发平台 - 组件开发示例

    所谓组件式开发平台,它所有的功能模块都是以组件的形式扩展的,下面我来演示一个简单的组件开发例程. Agile.Net开发管理平台项目,已经托管在开源中国码云平台(http://git.oschina. ...

  7. 10.15仿admin开发stark组件(一)

    2018-10-15 12:28:50 越努力,越幸运!永远不要高估自己! 低调做人,高调做事! 明天开stark项目!! admin 参考连接: http://www.cnblogs.com/yua ...

  8. 10.16 正式开发stark组件(一)

    2018-10-16 17:26:44 Django MTV  路由配置里面有 反向解析 参考连接:https://www.cnblogs.com/yuanchenqi/articles/762993 ...

  9. django 之 stark组件

    ----------------------------------------------------------------烦恼没完没了,内心动荡不安,呜呼哀哉. 一.有个特殊的需求,需要用sta ...

随机推荐

  1. C++STL内存配置的设计思想与关键源码分析

    说明:我认为要读懂STL中allocator部分的源码,并汲取它的思想,至少以下几点知识你要了解:operator new和operator delete.handler函数以及一点模板知识.否则,下 ...

  2. Java语言基础-运算符

    一丶逻辑运算符 1.&和&&的区别 (1).两个逻辑运算符的结果是一样的 (2).当第一个表达式为false时,&是会判断后边的表达式,而&&会产生短路 ...

  3. linux安装vmware出现Gtk-Message: Failed to load module pk-gtk-module canberra-gtk-module的解决方法

    使用此方法正确解决了问题, 文章地址如下: http://ian.wang/129.htm 为了防止以后看不到,特截图如下,希望博主不要怪罪.

  4. 机器人操作系统(ROS)在线实训平台学习实验指南

    机器人操作系统(ROS)在线学习指南       在高校开设ROS相关课程已经积累了一年多的经验,由于自动化类专业在课程安排中不同于计算机相关专业,通常没有Linux相关的课程基础,直接上手ROS较为 ...

  5. 快速生成树RTSP

    Note: 数据分组:

  6. 機器學習基石 机器学习基石(Machine Learning Foundations) 作业2 第10题 解答

    由于前面分享的几篇博客已经把其他题的解决方法给出了链接,而这道题并没有,于是这里分享一下: 原题: 这题说白了就是求一个二维平面上的数据用决策树来分开,这就是说平面上的点只能画横竖两个线就要把所有的点 ...

  7. 将HTML的页脚固定在屏幕下方

    /********************************************************************* * 将HTML的页脚固定在屏幕下方 * 说明: * 处理的 ...

  8. fedora 27

    安装 U盘安装,感谢学长的U盘 配置 安装外来软件的时候,需要输入root密码 软件 软件安装是个麻烦事儿啊 详情 [新手指南: 在 Ubuntu 和 Fedora 上安装软件包] Fedora 中文 ...

  9. vue运行原理

    Vue工作原理小结 本文能帮你做什么? 1.了解vue的双向数据绑定原理以及核心代码模块 2.缓解好奇心的同时了解如何实现双向绑定 为了便于说明原理与实现,本文相关代码主要摘自vue源码, 并进行了简 ...

  10. Android中的关于MDM中的几个方法举例

    Android中的关于MDM中的几个方法举例 首先介绍一下MDM是什么的缩写,MDM是什么? MDM 是 (Mobile Device Management )的缩写,中文翻译过来就是移动设备管理.随 ...