小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

【Python之路】特別篇

 highoo 2019-03-20

組合搜索:

  根據(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 Code

level為等級字段,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選擇器,正則表達式:

1
url(r'^video-(?P<direction_id>\d+)-(?P<classfication_id>\d+)-(?P<level_id>\d+).html', views.video),

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

 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多