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

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

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

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

数据库设计

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.htmlurl_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' #拼接对应位置的部分urlelse: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)  #拼接整体urltemp = 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 %}

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

视频后台逻辑处理部分

def video(request,*args,**kwargs):print(kwargs)# 当前请求的路径request_path = request.path# 从数据库获取视频时的filter条件字典q = {}# 状态为审核通过的q['status'] = 1# 获取url中的视频分类idclass_id = int(kwargs.get('classification_id'))# 从数据库中获取所有的视频方向(包括视频方向的id和name)direction_list = models.Direction.objects.all().values('id','name')# 如果视频方向是0if 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':passelse:# 如果视频分类不是全部,过滤条件为视频分类id在[url中的视频分类id]q['classification_id__in'] = [class_id,]else:print('方向不为0')# 方向选择某一个方向,# 如果分类是0if 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')# 获取所有视频分类对应的视频分类idid_list = list(map(lambda x: x['id'], class_list))# 过滤条件为视频分类id in [该方向下的所有视频分类id]q['classification_id__in'] = id_list else:# 方向不为0,分类也不为0obj = 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:passelse:print('不再,获取指定方向下的所有分类:选中的回到全部')url_part_list = request_path.split('-')url_part_list[2] = '0'request_path = '-'.join(url_part_list)# 视频等级idlevel_id = int(kwargs.get('level_id'))if level_id == 0:passelse:# 过滤条件增加视频等级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})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/47695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

06 mysql all查询 和 主键查询 和 非索引列查询

前言 本文主要调试一下 mysql 的如下两种查询语句 我们也来深入的看一下, 究竟如下两个普通的查询, mysql 做了什么事情 1. select * from user where id 991; 2. select * from user; 3. select * from user where name jerry991; 环境介绍 测试表 user schema 如下…

机器学习之数据清洗

一、介绍 数据清洗是机器学习中的一个重要步骤&#xff0c;它涉及对原始数据进行预处理和修复&#xff0c;以使数据适用于机器学习算法的训练和分析。数据清洗的目标是处理数据中的噪声、缺失值、异常值和不一致性等问题&#xff0c;以提高数据的质量和准确性。 二、方法 处理…

【3D激光SLAM】LOAM源代码解析--scanRegistration.cpp

系列文章目录 【3D激光SLAM】LOAM源代码解析–scanRegistration.cpp 【3D激光SLAM】LOAM源代码解析–laserOdometry.cpp 【3D激光SLAM】LOAM源代码解析–laserMapping.cpp 【3D激光SLAM】LOAM源代码解析–transformMaintenance.cpp 写在前面 本系列文章将对LOAM源代码进行讲解…

2023-08-21 Unity Shader 开发入门1 —— 渲染管线

文章目录 一、概述二、应用阶段三、几何阶段四、光栅化阶段 一、概述 ​ Unity 中的渲染管线和图形学中的渲染管线基本上指的是相同的概念&#xff0c;但是具体实现和细节方面可能存在一些差异。 ​ Unity 的渲染管线建立在图形学的基础上&#xff0c;但具有自己的实现和拓展。…

ClickHouse安装及部署

文章目录 Docker快速安装Ubuntu预编译安装包安装检查是否支持SSE4.2使用预编译安装包 Tgz安装包配置文件修改修改密码配置远程访问 其他主机访问文章参考 Docker快速安装 本地pull镜像 docker run -d --name ch-server --ulimit nofile262144:262144 -p 9000:9000 -p 8123:81…

stm32的命令规则

stm32型号的说明&#xff1a;以STM32F103RBT6这个型号的芯片为例&#xff0c;该型号的组成为7个部分&#xff0c;其命名规则如下&#xff1a;

Python网络爬虫入门到实战

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 网络爬虫&#xff08;We…

记录一个用C#实现的windows计时执行任务的服务

记录一个用C#实现的windows计时执行任务的服务 这个服务实现的功能是每天下午六点统计一次指定路径的文件夹大小 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.IO; using Syst…

基于互斥锁的生产者消费者模型

文章目录 生产者消费者 定义代码实现 / 思路完整代码执行逻辑 / 思路 局部具体分析model.ccfunc&#xff08;消费者线程&#xff09; 执行结果 生产者消费者 定义 生产者消费者模型 是一种常用的 并发编程模型 &#xff0c;用于解决多线程或多进程环境下的协作问题。该模型包含…

Go语言基础之切片

切片 切片&#xff08;Slice&#xff09;是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活&#xff0c;支持自动扩容。 切片是一个引用类型&#xff0c;它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合 切片的定义…

Redis 整合中 Redisson 的使用

大家好 , 我是苏麟 , 今天带来 Redisson 使用 . 官方文档 : GitHub - redisson/redisson: Redisson - Easy Redis Java client with features of In-Memory Data Grid. Sync/Async/RxJava/Reactive API. Over 50 Redis based Java objects and services: Set, Multimap, Sorte…

Alibaba-Easyexcel 使用总结

简介 简介 EasyExcel 是一个基于 Java 的简单、省内存的读写 Excel 的开源项目&#xff0c;在尽可能节约内存的情况下支持读写百 M 的 Excel。 但注意&#xff0c;其不支持&#xff1a; 单个文件的并发写入、读取读取图片宏 常见问题 Excel 术语 Sheet&#xff0c;工作薄…

RNN+LSTM正弦sin信号预测 完整代码数据视频教程

视频讲解:RNN+LSTM正弦sin信号预测_哔哩哔哩_bilibili 效果演示: 数据展示: 完整代码: import torch import torch.nn as nn import torch.optim as optim import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.preprocessing import…

Nginx代理功能与负载均衡详解

序言 Nginx的代理功能与负载均衡功能是最常被用到的&#xff0c;关于nginx的基本语法常识与配置已在上篇文章中有说明&#xff0c;这篇就开门见山&#xff0c;先描述一些关于代理功能的配置&#xff0c;再说明负载均衡详细。 Nginx代理服务的配置说明 1、上一篇中我们在http…

python的安装

1.进入python官网下载安装包&#xff1a;https://www.python.org/ 2.安装 注意&#xff1a;勾选Add Python 3.8 to PATH选项&#xff0c;并且建议选择Install Now选项&#xff0c;东西多。 解释&#xff1a;这里的path是指系统路径&#xff0c;即将python.exe文件添加到系 统…

常见的网络设备有哪些?分别有什么作用?

个人主页&#xff1a;insist--个人主页​​​​​​ 本文专栏&#xff1a;网络基础——带你走进网络世界 本专栏会持续更新网络基础知识&#xff0c;希望大家多多支持&#xff0c;让我们一起探索这个神奇而广阔的网络世界。 目录 一、网络设备的概述 二、常见的网络设备 1、…

JVS低代码中表单引擎与逻辑引擎是如何联合调用外部API的?

在企业项目中&#xff0c;常常出现需要给外部系统提供一个api &#xff0c;让外部系统触发调用&#xff0c;本系统直接数据入库&#xff0c;那么我们来看看jvs的表单引擎与逻辑引擎联合实现这个功能&#xff0c;先看实现效果&#xff1a; 配置步骤&#xff1a; 一、配置列表页…

网络面试题(172.22.141.231/26,该IP位于哪个网段? 该网段拥有多少可用IP地址?广播地址是多少?)

此题面试中常被问到&#xff0c;一定要会172.22.141.231/26&#xff0c;该IP位于哪个网段&#xff1f; 该网段拥有多少可用IP地址&#xff1f;广播地址是多少&#xff1f; 解题思路&#xff1a; 网络地址&#xff1a;172.22.141.192 10101100.00010110.10001101.11000000 广播…

【后端速成 Vue】第一个 Vue 程序

1、为什么要学习 Vue&#xff1f; 为什么使用 Vue? 回想之前&#xff0c;前后端交互的时候&#xff0c;前端收到后端响应的数据&#xff0c;接着将数据渲染到页面上&#xff0c;之前使用的是 JavaScript 或者 基于 JavaScript 的 Jquery&#xff0c;但是这两个用起来还是不太…