溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

stark組件3_filter過(guò)濾

發(fā)布時(shí)間:2020-06-15 13:03:30 來(lái)源:網(wǎng)絡(luò) 閱讀:470 作者:jedi911 欄目:編程語(yǔ)言

過(guò)濾項(xiàng)

在配置類(lèi)中定義,title字段沒(méi)什么意義,這次僅作演示用

list_filter = ["title", "publish", "authors"]

調(diào)用和取數(shù)據(jù)

調(diào)用:

filter_condition = self.get_filter_condition(request)

取出數(shù)據(jù):
連續(xù)兩個(gè)filter之間是且的關(guān)系,等于取出符合這兩個(gè)條件的數(shù)據(jù)

data_list = self.model.objects.all().filter(search_condition).filter(filter_condition)

處理邏輯

def get_filter_linktag(self):
    link_dic = {}

    #--------------------數(shù)據(jù)處理邏輯-------------------------
    #循環(huán)過(guò)濾項(xiàng)列表
    for filter_field in self.config.list_filter: #["title", "publish", "authors"]

        #獲取request.GET中相應(yīng)是哪個(gè)字段
        #舉例:http://127.0.0.1:8000/stark/app01/book/?publish=2
        #當(dāng)循環(huán)到publish時(shí)獲取這個(gè)2
        cid = self.request.GET.get(filter_field, 0)

        #根據(jù)字符串名稱(chēng)拿字段對(duì)象,self.config是當(dāng)前這張表的配置類(lèi)實(shí)例對(duì)象
        filter_field_obj = self.config.model._meta.get_field(filter_field)
        #print("filter_field_obj==>", filter_field_obj)
        #得到app01.Book.publish和app01.Book.authors

        #拿對(duì)象下面的數(shù)據(jù)
        #.rel .to 來(lái)自于ForeignKey和ManyToManyField這兩個(gè)類(lèi)
        #.rel可以看到對(duì)象的數(shù)據(jù)類(lèi)型,加上.to可以拿到對(duì)象下面的數(shù)據(jù),.to只對(duì)一對(duì)一,一對(duì)多,多對(duì)多有效
        #print(filter_field_obj.rel.to)
        #結(jié)果:
        #< class 'app01.models.Publish'>
        #< class 'app01.models.Author'>

        #判斷當(dāng)前字段對(duì)象是不是一對(duì)多或多對(duì)多類(lèi)型(需要提前引入這兩個(gè)類(lèi)),兩種情況取得值也有所不懂
        if isinstance(filter_field_obj, ForeignKey) or isinstance(filter_field_obj, ManyToManyField):
            #如果是的話(huà)就取這個(gè)字段關(guān)聯(lián)的內(nèi)容
            data_list = filter_field_obj.rel.to.objects.all() #[publish2, publish3....]
            # print("data_list==>", data_list)
            # < QuerySet[ < Publish: 圖靈新知 >, < Publish: dzm >, < Publish: 老男孩出版社 >] >
            # < QuerySet[ < Author: egon >, < Author: alex >] >
        else:#如果不是的話(huà)直接取字段對(duì)象的內(nèi)容,這里只取主鍵和當(dāng)前filter_field的值,比如當(dāng)前正好是"title"
            data_list = self.config.model.objects.all().values("pk", filter_field)
            #print("data_list==>", data_list)
            #data_list==> <QuerySet [{'pk': 7, 'title': 'go語(yǔ)言第三版'}, {'pk': 8, 'title': 'linux'}

        #----------------頁(yè)面渲染---------------
        temp = []
        #拷貝一份request.GET 用于修改
        params = copy.deepcopy(self.request.GET)

        #處理ALL標(biāo)簽
        #如果params(request.GET)中有值
        if params.get(filter_field):
            #刪除字典中原有的filter_field(例如是"publish"),但保留其它字段的內(nèi)容
            del params[filter_field]
            #添加html到列表,此處需要把params序列化
            temp.append(mark_safe("<a href='?%s'>ALL</a>" %params.urlencode()))
        else: #如果沒(méi)有值     
            temp.append(mark_safe("<a href=''>ALL</a>"))

        #處理數(shù)據(jù)標(biāo)簽
        #將data_list循環(huán)起來(lái) < QuerySet[ < Publish: 圖靈新知 >, < Publish: dzm >...] >
        for obj in data_list:
            #判斷當(dāng)前字段對(duì)象是不是一對(duì)多或多對(duì)多
            if isinstance(filter_field_obj, ForeignKey) or isinstance(filter_field_obj, ManyToManyField):
                #此時(shí)的obj是一個(gè)個(gè)對(duì)象,取主鍵值和文本內(nèi)容
                pk = obj.pk
                text = str(obj) #圖靈新知
                params[filter_field] = pk #結(jié)果<QueryDict: {'publish': [2]}>
            else: #如果不是
                #此時(shí)的obj是QuerySet{'pk': 10, 'title': 'PHP'}
                pk = obj.get("pk")
                text = obj.get(filter_field)
                params[filter_field] = text

            #params里面是QueryDict(<QueryDict: {'publish': [2]}>),所以要做序列化
            _url = params.urlencode()

            #給選中內(nèi)容加高亮
            if cid == str(pk) or cid == text:
                link_tag = "<a href='?%s' class='action'>%s</a>" % (_url, text)
            else:
                link_tag = "<a href='?%s'>%s</a>" % (_url, text)
            #添加到temp列表
            temp.append(mark_safe(link_tag))

        #構(gòu)建字典用作返回
        link_dic[filter_field] = temp
        #{'publish': ["<a href=''>ALL</a>", "<a href='?title=go%E8%AF%AD%E8%A8%80%E7%AC%AC%E4%B8%89%E7%89%88&publish=2'>圖靈新知</a>"...

    return link_dic
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI