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

分享

django多條件篩選搜索(項(xiàng)目實(shí)例)

 quasiceo 2017-08-03

多條件搜索在很多網(wǎng)站上都有用到,比如京東,淘寶,51cto,等等好多購物教育網(wǎng)站上都有,當(dāng)然網(wǎng)上也有很多開源的比樓主寫的好的多了去了,僅供參考,哈哈

先來一張效果圖吧,不然幻想不出來是什么樣的,前端樣式很low,畢竟主要是說后臺(tái)的嘛,前端為了簡(jiǎn)單測(cè)試就簡(jiǎn)單的寫出來啦,喜歡好的樣式可以自己去調(diào)哈

寫后臺(tái)的應(yīng)該都知道先從數(shù)據(jù)庫方面入手,所以我們先來設(shè)計(jì)數(shù)據(jù)庫

數(shù)據(jù)庫設(shè)計(jì)

1、視頻video

復(fù)制代碼
class Video(models.Model):

    status_choice = (
        (0, u'下線'),
        (1, u'上線'),
    )
    level_choice = (
        (1, u'初級(jí)'),
        (2, u'中級(jí)'),
        (3, u'高級(jí)'),
    )
    status = models.IntegerField(verbose_name='狀態(tài)', choices=status_choice, default=1)
    level = models.IntegerField(verbose_name='級(jí)別', choices=level_choice, default=1)
    classification = models.ForeignKey('Classification', null=True, blank=True)

    weight = models.IntegerField(verbose_name='權(quán)重(按從大到小排列)', default=0)

    title = models.CharField(verbose_name='標(biāo)題', max_length=32)
    summary = models.CharField(verbose_name='簡(jiǎn)介', max_length=32)
    img = models.ImageField(verbose_name='圖片', upload_to='./static/images/Video/')
    href = models.CharField(verbose_name='視頻地址', max_length=256)

    create_date = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'Video'
        verbose_name_plural = u'視頻'

    def __str__(self):
        return self.title
復(fù)制代碼

2、視頻方向Direction

復(fù)制代碼
class Direction(models.Model):
    weight = models.IntegerField(verbose_name='權(quán)重(按從大到小排列)', 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
復(fù)制代碼

3、視頻分類Classification

復(fù)制代碼
class Classification(models.Model):
    weight = models.IntegerField(verbose_name='權(quán)重(按從大到小排列)', default=0)
    name = models.CharField(verbose_name='名稱', max_length=32)

    class Meta:
        db_table = 'Classification'
        verbose_name_plural = u'分類(視頻分類)'

    def __str__(self):
        return self.name
復(fù)制代碼

好了大家一起來分析下數(shù)據(jù)庫設(shè)計(jì)

  • 視頻方向Direction類和視頻分類Classification多對(duì)多關(guān)系,因?yàn)橐粋€(gè)視頻方向可以有多個(gè)分類,一個(gè)視頻分類也可以有多個(gè)視頻方向視頻分類

  • Classification視頻分類和視頻Video類是一對(duì)多關(guān)系,因?yàn)橐粋€(gè)分類肯定有好多視頻

  • 視頻Video類中l(wèi)evel_choice 與視頻也是一對(duì)多關(guān)系,因?yàn)檫@個(gè)也就這三個(gè)分類,所以我選擇把他放在內(nèi)存里面取,畢竟這玩意常年不會(huì)變

 

url映射

復(fù)制代碼
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^video-(?P<direction_id>\d+)-(?P<classification_id>\d+)-(?P<level_id>\d+).html', views.video),
]
復(fù)制代碼

輸入的url為:http://127.0.0.1:8080/video-0-0-0.html

  • 中間第一個(gè)0代表視頻方向,第二個(gè)0代表食品分類,第三個(gè)0是視頻等級(jí),這個(gè)是根據(jù)汽車之間那個(gè)二手車學(xué)的,用著很方便哈哈

  • 0代表全部,然后遞增,當(dāng)選擇運(yùn)維自動(dòng)化,第一個(gè)0就會(huì)變成1

  • 下面那些都是一樣的道理

 

前端代碼

前端HTML,有用到django的simple_tag,從總體效果圖可以看出,前端主要分為兩部分,選擇部分和視頻展示部分

1、選擇部分

復(fù)制代碼
    <h3>選擇:</h3>
    <div>
        {% action_all current_url 1 %} :
        {% for item in direction_list %}

             {% action current_url item %}
        {% endfor %}
    </div>
    <div>
        {% action_all current_url 2 %} :
        {% for item in class_list %}

            {% action current_url item %}
        {% endfor %}
    </div>
    <div>
        {% action_all current_url 3 %} :
        {% for item in level_list %}
            {% action current_url item %}
        {% endfor %}
    </div>
復(fù)制代碼

中間主要是用simple_tag來做的前端代碼

復(fù)制代碼
@register.simple_tag
def action_all(current_url,index):
    """
    獲取當(dāng)前url,video-1-1-2.html
    :param current_url:
    :param item:
    :return:
    """
    url_part_list = current_url.split('-')
    if index == 3:
        if url_part_list[index] == "0.html":
            temp = "<a href='%s' class='active'>全部</a>"
        else:
            temp = "<a href='%s'>全部</a>"

        url_part_list[index] = "0.html"
    else:
        if url_part_list[index] == "0":
            temp = "<a href='%s' class='active'>全部</a>"
        else:
            temp = "<a href='%s'>全部</a>"

        url_part_list[index] = "0"


    href = '-'.join(url_part_list)

    temp = temp % (href,)
    return mark_safe(temp)


@register.simple_tag
def action(current_url, item,index):
    # videos-0-0-1.html
    # item: id name
    # video-   2   -0-0.html
    url_part_list = current_url.split('-')
 
    if index == 3:
        if str(item['id']) == url_part_list[3].split('.')[0]:  #如果當(dāng)前標(biāo)簽被選中
             temp = "<a href='%s' class='active'>%s</a>"
        else:
            temp = "<a href='%s'>%s</a>"
 
        url_part_list[index] = str(item['id']) + '.html' #拼接對(duì)應(yīng)位置的部分url
    else:
        if str(item['id']) == url_part_list[index]:
            temp = "<a href='%s' class='active'>%s</a>"
        else:
            temp = "<a href='%s'>%s</a>"
 
        url_part_list[index] = str(item['id'])
 
    ur_str = '-'.join(url_part_list)  #拼接整體url
    temp = temp %(ur_str, item['name']) #生成對(duì)應(yīng)的a標(biāo)簽
    return mark_safe(temp)  #返回安全的html
復(fù)制代碼

 

2、視頻展示區(qū)域

復(fù)制代碼
    <h3>視頻:</h3>
    {% for item in video_list %}
        <a class="item" href="{{ item.href }}">
            <img src="/{{ item.img }}" width="300px" height="400px">
            <p>{{ item.title }}</p>
            <p>{{ item.summary }}</p>
        </a>
    {% endfor %}
復(fù)制代碼

關(guān)鍵來啦關(guān)鍵來啦,最主要的處理部分在這里,往這看,往這看,往這看,主要的事情說三遍哈

視頻后臺(tái)邏輯處理部分

復(fù)制代碼
def video(request,*args,**kwargs):
    print(kwargs)
    # 當(dāng)前請(qǐng)求的路徑
    request_path = request.path
    # 從數(shù)據(jù)庫獲取視頻時(shí)的filter條件字典
    q = {}
    # 狀態(tài)為審核通過的
    q['status'] = 1
    # 獲取url中的視頻分類id
    class_id = int(kwargs.get('classification_id'))
    # 從數(shù)據(jù)庫中獲取所有的視頻方向(包括視頻方向的id和name)
    direction_list = models.Direction.objects.all().values('id','name')

    # 如果視頻方向是0
    if kwargs.get('direction_id') == '0':
        # 方向選擇全部
        # 方向id=0,即獲取所有的視頻分類(包括視頻分類的id和name)
        class_list = models.Classification.objects.all().values('id', 'name')
        # 如果視頻分類id也為0,即全部分類,那就什么都不用做,因?yàn)橐呀?jīng)全取出來了
        if kwargs.get('classification_id') == '0':
            pass
        else:
            # 如果視頻分類不是全部,過濾條件為視頻分類id在[url中的視頻分類id]
            q['classification_id__in'] = [class_id,]

    else:
        print('方向不為0')
        # 方向選擇某一個(gè)方向,
        # 如果分類是0
        if kwargs.get('classification_id') == '0':
            print('分類為0')
            # 獲取已選擇的視頻方向
            obj = models.Direction.objects.get(id=int(kwargs.get('direction_id')))
            # 獲取該方向的所有視頻分類
            class_list = obj.classification.all().values('id', 'name')
            # 獲取所有視頻分類對(duì)應(yīng)的視頻分類id
            id_list = list(map(lambda x: x['id'], class_list))
            # 過濾條件為視頻分類id in [該方向下的所有視頻分類id]
            q['classification_id__in'] = id_list 
        else:
            # 方向不為0,分類也不為0
            obj = models.Direction.objects.get(id=int(kwargs.get('direction_id')))
            class_list = obj.classification.all().values('id', 'name')
            id_list = list(map(lambda x:x['id'], class_list))
            # 過濾條件為視頻分類id in [已經(jīng)選擇的視頻分類id]
            q['classification_id__in'] = [class_id,] 
            print('分類不為0')
            # 當(dāng)前分類如果在獲取的所有分類中,則方向下的所有相關(guān)分類顯示
            # 當(dāng)前分類如果不在獲取的所有分類中,
            if int(kwargs.get('classification_id')) in id_list:
                pass
            else:
                print('不再,獲取指定方向下的所有分類:選中的回到全部')
                url_part_list = request_path.split('-')
                url_part_list[2] = '0'
                request_path = '-'.join(url_part_list)
    # 視頻等級(jí)id
    level_id = int(kwargs.get('level_id'))
    if level_id == 0:
        pass
    else:
        # 過濾條件增加視頻等級(jí)
        q['level'] = level_id 

    # 取出相對(duì)應(yīng)的視頻
    video_list = models.Video.objects.filter(**q).values('title','summary', 'img', 'href')
    # 把視頻等級(jí)轉(zhuǎn)化為單個(gè)標(biāo)簽是字典格式,整體是列表格式
    ret = map(lambda x:{"id": x[0], 'name': x[1]}, models.Video.level_choice)
    level_list = list(ret)
    return render(request, 'video.html', {'direction_list': direction_list,
                                          'class_list': class_list,
                                          'level_list': level_list,
                                          'current_url': request_path,
                                          "video_list": video_list})

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多