Python学习笔记_实战篇(二)_django多条件筛选搜索

这篇具有很好参考价值的文章主要介绍了Python学习笔记_实战篇(二)_django多条件筛选搜索。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

多条件搜索在很多网站上都有用到,比如京东,淘宝,51cto,等等好多购物教育网站上都有,当然网上也有很多开源的比楼主写的好的多了去了,仅供参考,哈哈

先来一张效果图吧,不然幻想不出来是什么样的,前端样式很low,毕竟主要是说后台的嘛,前端为了简单测试就简单的写出来啦,喜欢好的样式可以自己去调哈

Python学习笔记_实战篇(二)_django多条件筛选搜索,Python,python,学习,笔记

写后台的应该都知道先从数据库方面入手,所以我们先来设计数据库

数据库设计

1、视频video

class Video(models.Model):

    status_choice = (
        (0, u'下线'),
        (1, u'上线'),
    )
    level_choice = (
        (1, u'初级'),
        (2, u'中级'),
        (3, u'高级'),
    )
    status = models.IntegerField(verbose_name='状态', choices=status_choice, default=1)
    level = models.IntegerField(verbose_name='级别', choices=level_choice, default=1)
    classification = models.ForeignKey('Classification', null=True, blank=True)

    weight = models.IntegerField(verbose_name='权重(按从大到小排列)', default=0)

    title = models.CharField(verbose_name='标题', max_length=32)
    summary = models.CharField(verbose_name='简介', 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

2、视频方向Direction

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

3、视频分类Classification

class Classification(models.Model):
    weight = models.IntegerField(verbose_name='权重(按从大到小排列)', 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

好了大家一起来分析下数据库设计

  • 视频方向Direction类和视频分类Classification多对多关系,因为一个视频方向可以有多个分类,一个视频分类也可以有多个视频方向视频分类

  • Classification视频分类和视频Video类是一对多关系,因为一个分类肯定有好多视频

  • 视频Video类中level_choice 与视频也是一对多关系,因为这个也就这三个分类,所以我选择把他放在内存里面取,毕竟这玩意常年不会变

url映射

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),
]

输入的url为:http://127.0.0.1:8080/video-0-0-0.html

  • 中间第一个0代表视频方向,第二个0代表食品分类,第三个0是视频等级,这个是根据汽车之间那个二手车学的,用着很方便哈哈

  • 0代表全部,然后递增,当选择运维自动化,第一个0就会变成1

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

前端代码

前端HTML,有用到django的simple_tag,从总体效果图可以看出,前端主要分为两部分,选择部分和视频展示部分

1、选择部分

    <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>

中间主要是用simple_tag来做的前端代码

@register.simple_tag
def action_all(current_url,index):
    """
    获取当前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]:  #如果当前标签被选中
             temp = "<a href='%s' class='active'>%s</a>"
        else:
            temp = "<a href='%s'>%s</a>"
 
        url_part_list[index] = str(item['id']) + '.html' #拼接对应位置的部分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']) #生成对应的a标签
    return mark_safe(temp)  #返回安全的html

2、视频展示区域

    <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 %}

关键来啦关键来啦,最主要的处理部分在这里,往这看,往这看,往这看,主要的事情说三遍哈

视频后台逻辑处理部分文章来源地址https://www.toymoban.com/news/detail-664725.html

def video(request,*args,**kwargs):
    print(kwargs)
    # 当前请求的路径
    request_path = request.path
    # 从数据库获取视频时的filter条件字典
    q = {}
    # 状态为审核通过的
    q['status'] = 1
    # 获取url中的视频分类id
    class_id = int(kwargs.get('classification_id'))
    # 从数据库中获取所有的视频方向(包括视频方向的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,即全部分类,那就什么都不用做,因为已经全取出来了
        if kwargs.get('classification_id') == '0':
            pass
        else:
            # 如果视频分类不是全部,过滤条件为视频分类id在[url中的视频分类id]
            q['classification_id__in'] = [class_id,]

    else:
        print('方向不为0')
        # 方向选择某一个方向,
        # 如果分类是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')
            # 获取所有视频分类对应的视频分类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 [已经选择的视频分类id]
            q['classification_id__in'] = [class_id,] 
            print('分类不为0')
            # 当前分类如果在获取的所有分类中,则方向下的所有相关分类显示
            # 当前分类如果不在获取的所有分类中,
            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)
    # 视频等级id
    level_id = int(kwargs.get('level_id'))
    if level_id == 0:
        pass
    else:
        # 过滤条件增加视频等级
        q['level'] = level_id 

    # 取出相对应的视频
    video_list = models.Video.objects.filter(**q).values('title','summary', 'img', 'href')
    # 把视频等级转化为单个标签是字典格式,整体是列表格式
    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})

到了这里,关于Python学习笔记_实战篇(二)_django多条件筛选搜索的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue+element ui 表格添加多个搜索条件筛选(前端查询)

    filterList 为筛选后的数据,可以重新给tableData赋值,赋值后如果遇到表格数据不刷新的情况,可以给table加上一个随机的key。这样可以解决重新赋值页面不刷新的情况。

    2024年02月16日
    浏览(27)
  • 【Vue3】2-12 : 【案例】搜索关键词加筛选条件的综合

    本书目录:点击进入 一、【案例】搜索加筛选条件的综合 1.1、逻辑 1.2、效果 1.3、json数据 - 02-data.json 1.4、代码 计算属性 - 绑定list,并过滤 input  双向绑定 - 当input改变时,计算属性过滤name button组 双向绑定  - 当input改变时,计算属性过滤性别

    2024年01月20日
    浏览(36)
  • 基于Django的Python应用——学习笔记

    环境:Python3.11           Django5.0.1 为项目新建一个目录,将其命名为 learning_log ,再在终端中切换到这个目录,并创建一个虚拟环境。 项目列表生成了这样的一个文件夹 控制台前方出现高亮即为成功 在依然处于活动的虚拟环境的情况下( ll_env 包含在括号内),执行如下命

    2024年02月21日
    浏览(61)
  • 基于Django的Python应用—学习笔记—功能完善

    创建基于表单的页面的方法几乎与前面创建网页一样:定义一个 URL ,编写一个视图函数并编写一个模板。一个主要差别是,需要导入包含表单 的模块forms.py 。 edit_entry.html new_entry.html new_topic.html

    2024年01月20日
    浏览(32)
  • Python学习笔记_进阶篇(四)_django知识(三)

    本章内容: Django 发送邮件 Django cookie Django session Django CSRF 我们常常会用到一些发送邮件的功能,比如有人提交了应聘的表单,可以向HR的邮箱发邮件,这样,HR不看网站就可以知道有人在网站上提交了应聘信息。今天我们尝试用django发送邮件做尝试 1、配置相关参数settings 往

    2024年02月11日
    浏览(31)
  • Python学习笔记_进阶篇(二)_django知识(一)

    本章简介: Django 简介 Django 基本配置 Django url Django view Django 模板语言 Django Form Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的软件设计模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的。并于

    2024年02月12日
    浏览(36)
  • Python学习笔记_进阶篇(三)_django知识(二)

    本章内容 Django model django默认支持sqlite,mysql, oracle,postgresql数据库。 1 sqlite django默认使用sqlite的数据库,默认自带sqlite的数据库驱动 引擎名称:django.db.backends.sqlite3 2mysql 引擎名称:django.db.backends.mysql 1、配置文件中sqlite 2、配置文件中mysql 注:由于Django内部连接MySQL时使用的

    2024年02月12日
    浏览(30)
  • Python学习笔记-Django框架基础,APP,数据模型,后台管理,路由

    Django框架是Python的常用web框架,遵循 MVC 设计模式的框架,采用了MTV的框架模式,即模型M,视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。这套框架是以比利时的

    2024年02月16日
    浏览(29)
  • 【Pandas学习】多条件筛选DataFrame

    目录 一、按列筛选 1、简单筛选 2、多条件筛选  二、按行筛选 三、多条件组合 DataFrameSeries  执行 、 、 == 这些运算符时,会将每一个元素进行比较,得到一个由结果( Boolean 值)组成的相同大小的 DataFrameSeries 返回。 相同大小的 DataFrameSeries 之间可以用 、 | 、 ~ 运算符进

    2024年02月16日
    浏览(23)
  • 机器学习笔记 - 基于Python发现最佳计算机视觉模型的神经架构搜索技术NAS

            近年来,随着深度学习技术的兴起,计算机视觉领域取得了巨大进步。事实证明,卷积神经网络 (CNN) 在图像识别任务中异常强大,但针对特定问题设计最佳架构仍然是一项具有挑战性的任务。这就是神经架构搜索(NAS)发挥作用的地方。NAS 是一种尖端技术,可以

    2024年02月14日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包