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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章