Python Day24 stark组件2

知识点

Q查询的应用及查询关键字

from django.db.models import Q

#实例化出一个Q对象

q=Q()

#往q中添加第一个条件

q.children.append(("price", 100))

#往q中添加第二个条件

q.children.append(("title", "python"))

#这里也可以使用变量,例如q.children.append((field+"contains", val))
此时打印q

[('price__100', 'linux'), (title__contains', 'python')]

#最后把q放到CRM语句中进行查询

Book.objects.filter(q)

默认模式两个条件之间是且的关系,调整成或的关系(在添加条件之前执行)

q.connector="or"

Django各种条件查询关键字

__exact 精确等于 like ‘aaa’ 
__iexact 精确等于 忽略大小写 ilike ‘aaa’ 
__contains 包含 like ‘%aaa%’ 
__icontains 包含 忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains。 
__gt 大于 
__gte 大于等于 
__lt 小于 
__lte 小于等于 
__in 存在于一个list范围内 
__startswith 以…开头 
__istartswith 以…开头 忽略大小写 
__endswith 以…结尾 
__iendswith 以…结尾,忽略大小写 
__range 在…范围内 
__year 日期字段的年份 
__month 日期字段的月份 
__day 日期字段的日 
__isnull=True/False

知识点_获取函数的名称

def foo():
    pass

print(foo.__name__)
#结果是个字符串
foo

stark组件_search功能的实现

要实现的功能:
在搜索框中输入任何,则显示相应内容,(例如输入python,只显示跟有python关键字的内容)

思路

跟list_display一样的思路,在自定义配置类中设置一个search_fields = ["title", "price"],
搜索时,如果有自定义的self.search_fields,就按照自定义的执行,没有的话就按照默认ModelStark中的search_fields为空执行
1.在list_view中引入Q查询,并实例化出一个对象,因为有多个查询条件,且要用到变量,这里使用Q查询的功能
2.取到页面传过来的值(查询内容)
3.判断是否有值
4.把Q查询的实例对象多查询条件的关系调整为“或”
5.循环查询字段的列表(search_fields)
6.把查询条件添加到Q查询中
7.在ORM语句中使用Q查询的实例化对象作为查询条件
8.把查询结果返回给页面

代码参考

def get_search_condition(self, request):
    # ---处理search功能开始---
    from django.db.models import Q
    # 实例化一个Q
    search_condition = Q()
    # 取到页面传进来的值
    val = request.GET.get("q")
    if val:
        search_condition.connector = "or"

        # self.search_fields里面是["title", "price"]
        for field in self.search_fields:
        #添加查询条件元祖左边是字段名,右边是查询内容,__contains是模糊查询的意思
            search_condition.children.append((field + "__contains", val))
            # ---处理search功能结束---

    return search_condition

stark组件_action功能的实现

思路

第一阶段:构建访问页面:

1.自定义配置类中设置功能函数(BookConfig)
例如批量初始化,批量删除,每个功能对应一个函数,函数内是对数据库的操作逻辑

2.把这些函数放入到一个列表中,例如actions = [patch_init, patch_delete],这里面是一个个的函数
这个列表确定了访问相应页面时action到底有什么选项
别忘了在ModelStark中也设置个actions = [],如果相应表单没有自定义actions就走这个公共的

3.在sites.py中的Show_List类中新增一个函数处理action功能需求,比如叫get_new_actions

4.在这个get_new_actions中循环自定义配置类中的actions列表,获取到一个个的函数
5.通过每个函数获取到这个函数的中文名(用于显示在页面给用户看),以及这个函数本身的名字(str)
(用于作为页面中select的value,未来要通过这个value来获知用户到底选择的是哪个功能)
6.把上面获取到的两个信息拼到一个列表中,作为get_new_actions这个函数的返回值
7.因为传给模板的是一个Show_List类的实例对象,例如叫它sl,因此通过sl.get_new_actions模板就可以获得上面的数据

至此,用户访问的页面就构建完了

第二阶段:执行action操作

此时用户在页面上勾选了多选框,在select中选择了要执行的操作(例如批量删除),点击Go按钮,提交了post请求
1.在视图中,通过post请求获取到要执行功能的函数名,就是页面中select的value,,利用反射将它换成一个函数
2.获取记录的主键值,也就是用户到底选择操作哪几条数据
3.执行第一步获取到的函数,同时把主键值作为参数传进去

第三阶段:修改数据,构建新页面

1.例如此时执行的是自定义配置类中的patch_delete函数,就通过传过去的主键值找出相应数据库条目,做删除操作
2.之后继续走视图函数中的剩余代码,最后通过render构建页面
3.此时返回给用户的新页面就是做了删除的页面
至此流程走完了

示例代码

#Show_List类中

def get_new_actions(self):

    action_list = []
    for i in self.config.actions:
        action_list.append({
            #获取注释
            "desc": i.desc,
            #获取变量名
            "name": i.__name__,
        })

    return action_list

#ModelStark类中

def list_view(self, request):

    if request.method == "POST":
        action = request.POST.get("action")
        selected_pk = request.POST.getlist("selected_pk")
        print("selected_pk==>", selected_pk)

        action = getattr(self, action)
        action(selected_pk)

#自定义配置类中

def patch_init(self, selected_pk):

    self.model.objects.filter(pk__in=selected_pk).update(price=0)

patch_init.desc = "批量初始化"

def patch_delete(self, selected_pk):

    self.model.objects.filter(pk__in=selected_pk).delete()

patch_delete.desc = "批量删除"

actions = [patch_init, patch_delete]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章