|
組合搜索: 根據(jù)特定標簽內(nèi)容,返回符合的數(shù)據(jù)。 效果圖:
設計規(guī)劃: 一、數(shù)據(jù)庫表劃分: 1.方向表,(運維自動化,Python開發(fā),。。) 2.分類表,(Python,Java,C#,。) 3.多對多,方向與分類外鍵表, 4.視頻表,(視頻1,視頻2,。。。) 二、表間關系: 方向表與分類表:為多對多關系, 1個方向可以有多種分類,1個分類可以同時對應多個方向。 分類表與視頻表:一對多關系, 1個分類可以有多個視頻。 三、表內(nèi)詳細設計: 方向表: class Direction(models.Model): weight = models.IntegerField(verbose_name='權重(按從大到小排列)', default=0) name = models.CharField(verbose_name='名稱', max_length=32) classification = models.ManyToManyField('Classification') class Meta: db_table = 'Direction' verbose_name_plural = u'方向(視頻方向)' def __str__(self): return self.name classfication為方向表(Direction)多對多關系字段; 分類表:
View Code視頻表:
View Codelevel為等級字段,status為視頻狀態(tài)字段;
具體效果: 通過對比其他同類型的搜索示例發(fā)現(xiàn),他們大多數(shù)都通過URL地址來向后臺傳遞類別 id 查詢數(shù)據(jù)庫,然后返回數(shù)據(jù)給前端頁面。
可以發(fā)現(xiàn):方向對應第一個數(shù)字,分類對應第二個數(shù)字,等級對應第三個數(shù)字。 方向的標簽代碼為:
當點擊分類或等級時,其自身對應的id數(shù)字會發(fā)生改變,而另外兩個數(shù)字id不產(chǎn)生變化。
設計步驟: 1.我們先設計出通過輸入網(wǎng)頁URL地址的方式,動態(tài)改變頁面標簽代碼中的值。 設計URL選擇器,正則表達式:
direction_id 為獲得方向id,classfication_id為獲得分類id,level_id為獲得等級id 2.輸入url: /video-1-2-1.html 后參數(shù)傳遞給 views.video()函數(shù)處理。 def video(request,*args,**kwargs): current_url = request.path #當前輸入網(wǎng)頁路徑 /video-0-0-0.html direction_id = int(kwargs.get('direction_id')) #獲得相應的id classfication_id = int(kwargs.get('classfication_id')) level_id = int(kwargs.get('level_id')) 接下來通過獲得的id數(shù)據(jù)查詢數(shù)據(jù)庫信息; 此時,我們得知數(shù)據(jù)庫中id字段是從1開始遞增,所以我們設計當id=0 時為獲得全部數(shù)據(jù)。 1.當方向為0時,表示直接從數(shù)據(jù)庫獲取所有的分類信息: 由于,方向字段在網(wǎng)頁上表現(xiàn)為永遠顯示全部數(shù)據(jù)。所以設計如下 def video(request,*args,**kwargs): # ...... 省略了部分 # 獲得所有方向信息: direction_list = models.Direction.objects.all().values('name','id') if direction_id != 0 : # 分類不等于0 即選擇了其中一個分類, /video-1-3-1.html # 取 url相對應的分類信息(根據(jù) 方向id 進行查詢,連表查詢) direction = models.Direction.objects.get(id=direction_id) classfication_list = direction.classification.values('name', 'id') else: classfication_list = models.Classification.objects.all().values('name','id') #分類等于0 為 全部, 直接取全部分類數(shù)據(jù) # 獲得所有等級信息 # level_list = models.Video.level_choice ret = map(lambda x:{'name':x[1],'id':x[0]},models.Video.level_choice) level_list = list(ret) # 數(shù)據(jù)返回前端頁面 return render(request,'video.html',{'direction_list':direction_list,'class_list':classfication_list,'level_list':level_list,'current_url':current_url}) 其中,等級信息,存放在video表中的level字段中,以元組形式存放,為了統(tǒng)一我們將(元組,..)的形式 => [字典,..],使用了map()函數(shù) 向前端頁面返回了,方向,分類,等級的數(shù)據(jù)和當前url地址。 /video-1-3-1.html。 核心:前端接收到當前url地址后,通過模版語言simple_tag,動態(tài)的構造a標簽的href屬性,即可表現(xiàn)為當改變url時,標簽href也同時發(fā)生改變 前端頁面: <div> {% for item in direction_list %} {% simple_tag函數(shù) current_url item %} {% endfor %} </div> 3.設計simple_tag函數(shù)。 需要在項目app下創(chuàng)建 templatetags包, 然后自定義一個文件 xx.py from django import template from django.utils.safestring import mark_safe register = template.Library() @register.simple_tag def action1(current_url, item): url_part_list = current_url.split('-') # 如果當前url中第一個位置 video-2-0-0.html if str(item['id']) == url_part_list[1]: temp = "<a href='%s' class='active'>%s</a>" else: temp = "<a href='%s'>%s</a>" url_part_list[1] = str(item['id']) ur_str = '-'.join(url_part_list) temp = temp %(ur_str, item['name']) return mark_safe(temp) 得到了一個處理 方向 標簽的模板函數(shù),方向、等級標簽的處理方式同上,只是url切割的位置稍有不同!
前端video.html
newtag.py然后再設計一個在前端同時輸出, "全部" 的simple_tag函數(shù)
前端video.html
newtag.py為了降低simple_tag代碼過于冗余,我們用if..else統(tǒng)一歸類成一個函數(shù):
前端video.html
newtag.py至此,我們已經(jīng)完成了 頁面上輸出全部的方向、分類、等級的數(shù)據(jù),以及通過url地址改變動態(tài)修改了a標簽href代碼和添加了選中時特效。我們還需要添加限制規(guī)則,規(guī)定當 方向 改變時,出現(xiàn)不同的分類! 4.進一步考慮添加規(guī)則! 當輸入的url中,方向id等于0 時, => 顯示全部分類, video-0-0-2.html 不等于0 時,=> if 分類id等于0 => 分類根據(jù) 方向id 取出數(shù)據(jù) 不等于0 => 分類根據(jù) 方向id 取出數(shù)據(jù) 當先輸入的url中,分類id沒有出現(xiàn)在通過查詢獲得的分類id時,需要把分類id 置為0。
views.video()5.最后考慮輸出視頻數(shù)據(jù): 當方向、分類、等級id都為0時,輸出全部的視頻; 當方向=0、分類!=0時,根據(jù)分類id查詢數(shù)據(jù)庫 當方向!=0、分類=0時,根據(jù)分類id查詢數(shù)據(jù)庫 當方向!=0、分類!=0時,根據(jù)分類id查詢數(shù)據(jù)庫 當?shù)燃?=0時, 根據(jù)分類id,等級id查詢數(shù)據(jù)庫
views.video()注意: 查詢時,可以通過構造一個字典的方式添加查詢條件,返回最終結果。 q = {}
ret = models.X.objects.filter(**q).values('..,..')
最終效果圖:
完整代碼:
后臺 views.py
后臺 models.py
后臺 newtag.py
前端 video.html
|
|
|
來自: highoo > 《數(shù)據(jù)分析》