django 组合搜索

urls:

urlpatterns = [    path(‘admin/‘, admin.site.urls),    path(‘index/‘, views.index),    re_path(r‘^video-(?P<direction_id>(\d+))-(?P<classes_id>(\d+))-(?P<level_id>(\d+)).html$‘,views.video,name=‘video2‘),#使用关键字正则表达式匹配]

models:
class Direction(models.Model):    name = models.CharField(max_length=20)

class Meta:        db_table = ‘direction‘        verbose_name_plural = ‘方向‘

def __str__(self):        return self.name

class Classes(models.Model):    name = models.CharField(max_length=20)    classes = models.ManyToManyField(‘Direction‘,related_name=‘classes‘)

class Meta:        db_table = ‘classes‘        verbose_name_plural = ‘课程‘

def __str__(self):        return self.name

class Level(models.Model):    title = models.CharField(max_length=20)    level = models.ManyToManyField(‘Classes‘,related_name=‘level‘)

class Meta:        db_table = ‘level‘        verbose_name_plural = ‘级别‘

def __str__(self):        return self.title

class Video(models.Model):    status = (        (0,‘下线‘),        (1,‘上线‘)    )    video_status = models.IntegerField(choices=status,verbose_name=‘状态‘)    classes = models.ForeignKey(‘Classes‘,on_delete=models.CASCADE,related_name=‘course‘,verbose_name=‘课程‘)    level = models.ForeignKey(‘Level‘,on_delete=models.CASCADE,related_name=‘grade‘,verbose_name=‘难度级别‘)    wright = models.IntegerField(unique=True,verbose_name=‘权重‘)    title = models.CharField(max_length=20,verbose_name=‘标题‘)    intro = models.CharField(max_length=32,verbose_name=‘简介‘)    href = models.CharField(max_length=50,verbose_name=‘视频地址‘)

class Meta:        db_table = ‘video‘        verbose_name_plural = ‘视频教程‘

def __str__(self):        return self.title

views:
def video(request,*args,**kwargs):#添加关键字匹配    container = {}    #创建一个空字典用于给视频字段搜索    for k,v in kwargs.items():  #把kwargs传过来的关键字参数的值转换为int类型        temp = int(v)        kwargs[k] = temp

direction_id = kwargs.get(‘direction_id‘)  #拿到关键字参数    classes_id = kwargs.get(‘classes_id‘)    level_id = kwargs.get(‘level_id‘)

direction_list = models.Direction.objects.all()   #方向字段

if direction_id == 0:      #如果方向为0,列出全部课程        class_list = models.Classes.objects.all()        if classes_id == 0:    #如果课程为0,不做任何操作,如果课程不为0把课程ID添加到container字典中            pass        else:            container[‘classes_id‘] = classes_id        if level_id == 0:     #如果难度级别为0,不做任何操作,如果不为0把难度级别ID添加到container字典中            pass        else:            container[‘level_id‘] = level_id    else:        direction_obj = models.Direction.objects.filter(id=direction_id).first()  #如果方向不为0,根据关键字传过来的ID参数筛选方向对象        class_list = direction_obj.classes.all()      #列出方向对象对应的所有课程        v_list = direction_obj.classes.all().values_list(‘id‘)  #生成方向对象对应的所有课程的ID列表        if not v_list:        #如果没有匹配到课程ID列表把列表设置为空            classes_id_list = []        else:            classes_id_list = list(zip(*v_list))[0]   #如果匹配到了通过ZIP函数生成课程ID列表

if classes_id == 0:        #如果课程ID为0 用双下划线In方法匹配这个方向下所有的课程ID            container[‘classes_id__in‘] = classes_id_list        else:                  #如果不为0 课程ID赋值给容器字典            container[‘classes_id‘] = classes_id

if classes_id in classes_id_list:  #如果课程ID在匹配到的课程列表内            container[‘classes_id‘] = classes_id        else:                    #如果课程ID超出范围            container[‘classes_id__in‘] = classes_id_list

if level_id == 0:            pass        else:            container[‘level_id‘] = level_id

level_list = models.Level.objects.all()

video_list = models.Video.objects.filter(**container)  #通过关键字解包匹配视频字段

return render(request,‘video.html‘,locals())

HTML:
<div>    <h1>筛选</h1>    <div>        {% if kwargs.direction_id == 0 %}            <a class="actives" href="/video-0-{{ kwargs.classes_id }}-{{ kwargs.level_id }}.html">全部</a>        {% else %}            <a href="/video-0-{{ kwargs.classes_id }}-{{ kwargs.level_id }}.html">全部</a>        {% endif %}        {% for item in direction_list %}            {% if item.id == kwargs.direction_id %}                <a class="actives" href="/video-{{ item.id }}-{{ kwargs.classes_id }}-{{ kwargs.level_id }}.html">{{ item.name }}</a>            {% else %}                <a href="/video-{{ item.id }}-{{ kwargs.classes_id }}-{{ kwargs.level_id }}.html">{{ item.name }}</a>            {% endif %}        {% endfor %}    </div>    <div>        {% if kwargs.classes_id == 0 %}            <a class="actives" href="/video-{{ kwargs.direction_id }}-0-{{ kwargs.level_id }}.html">全部</a>        {% else %}            <a href="/video-{{ kwargs.direction_id }}-0-{{ kwargs.level_id }}.html">全部</a>        {% endif %}        {% for item in class_list %}            {% if item.id == kwargs.classes_id %}                <a class="actives" href="/video-{{ kwargs.direction_id }}-{{ item.id }}-{{ kwargs.level_id }}.html">{{ item.name }}</a>            {% else %}                <a href="/video-{{ kwargs.direction_id }}-{{ item.id }}-{{ kwargs.level_id }}.html">{{ item.name }}</a>            {% endif %}        {% endfor %}    </div>    <div>        {% if kwargs.level_id == 0 %}            <a class="actives" href="/video-{{ kwargs.direction_id }}-{{ kwargs.classes_id }}-0.html">全部</a>        {% else %}            <a href="/video-{{ kwargs.direction_id }}-{{ kwargs.classes_id }}-0.html">全部</a>        {% endif %}        {% for item in level_list %}            {% if item.id == kwargs.level_id %}                <a class="actives" href="/video-{{ kwargs.direction_id }}-{{ kwargs.classes_id }}-{{ item.id }}.html">{{ item.title}}</a>            {% else %}                <a href="/video-{{ kwargs.direction_id }}-{{ kwargs.classes_id }}-{{ item.id }}.html">{{ item.title}}</a>            {% endif %}        {% endfor %}    </div></div>

<div>    <h1>结果</h1>    <div>        {% for item in video_list %}            <p>{{ item.title }}</p>        {% endfor %}    </div></div>
 
 
 

原文地址:https://www.cnblogs.com/louzi/p/9297376.html

时间: 2024-11-01 22:21:54

django 组合搜索的相关文章

Django实现组合搜索的方法示例

目录 一.实现方法 二.基本原理 三.代码样例 方法1:纯模板语言实现 方法二:使用simpletag实现 四.其他变化 1.model定义 2.处理函数变化 3.simpletag相应改变 一.实现方法 1.纯模板语言实现 2.自定义simpletag实现(本质是简化了纯模板语言的判断) 二.基本原理 原理都是通过django路由系统,匹配url筛选条件,将筛选条件作为数据库查询结果,返回给前端. 例如:路由系统中的url格式是这样: ? 1 url(r'^article-(?P<articl

Django 之组合搜索

现在很多网站都会有这样的组合搜索功能,其实质是几个模型之间组合对数据库进行查询,并将结果显示到页面上. 每一行都是一个模型,模型之间有着连表关系(一对多.多对多等) 模型设计 总共四个模型:分别为方向.分类.等级以及存储结果信息 一个方向下可以有多个分类,一个分类也可以是多个方向(多对多) 一个分类可以有多个视频(一对多) 一个等级下也可以有多个视频(一对多) from django.db import models class Direction(models.Model): ""&

四十七 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索的自动补全功能

elasticsearch(搜索引擎)提供了自动补全接口 官方说明:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters-completion.html 1.创建搜索自动补全字段suggest 自动补全需要用到一个字段名称为suggest类型为Completion类型的一个字段 所以我们需要用将前面的elasticsearch-dsl操作elasticsearch(搜索引擎)增加sugg

第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页

第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)用Django实现搜索结果分页 逻辑处理函数 计算搜索耗时 在开始搜索前:start_time = datetime.now()获取当前时间 在搜索结束后:end_time = datetime.now()获取当前时间 last_time = (end_time-start_time).total_seconds()结束时间减去开始时间等于用时,转换成秒 from django.shortcu

第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索的自动补全功能

第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-用Django实现搜索的自动补全功能 elasticsearch(搜索引擎)提供了自动补全接口 官方说明:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters-completion.html 创建自动补全字段 自动补全需要用到一个字段名称为suggest类型为Completion类型的一个字段 所以我们需要用

stark组件开发之组合搜索页面效果和 URL

页面效果,只是样式.这个好解决!yield 的时候. 返回几个样式出去就好了! 并且前端写上一些样式的css {% if search_group_row_list %} <div class="panel panel-default"> <div class="panel-heading"> <i class="fa fa-filter" aria-hidden="true"></i

Django实现组合搜索

一.实现方法 1.纯模板语言实现 2.自定义simpletag实现(本质是简化了纯模板语言的判断) 二.基本原理 原理都是通过django路由系统,匹配url筛选条件,将筛选条件作为数据库查询结果,返回给前端. 例如:路由系统中的url格式是这样: url(r'^article-(?P<article_type_id>\d+)-(?P<category_id>\d+).html',views.filter) 其中article_type_id和category_id和数据库中字段是

四十九 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页

逻辑处理函数 计算搜索耗时 在开始搜索前:start_time = datetime.now()获取当前时间 在搜索结束后:end_time = datetime.now()获取当前时间 last_time = (end_time-start_time).total_seconds()结束时间减去开始时间等于用时,转换成秒 from django.shortcuts import render # Create your views here. from django.shortcuts imp

组合搜索框的实现

在当前APP目录下新建templatetags目录: 新建任意名字python名字,然后前端里面的写法是现在html页面开头导入: {% load filter %} <div class="cotent-head1"><i class="fa fa-search" aria-hidden="true"></i>搜索条件</div> <div class="cotent-searh&