27-Django项目实战(5)
1 歌曲搜索
音乐平台的每个网页顶部都设置了歌曲搜索功能,歌曲搜索框以网页表单的形式展示,并且以POST请求方式实现歌曲搜索功能,搜索结果显示在歌曲搜索页。歌曲搜索页由项目应用search实现,首先在search的urls.py中定义路由search。
1.1 路由定义
from django.urls import path
from .views import *
urlpatterns = [path('<int:page>.html', searchView, name='search'),
]
路由search设置了路由变量page,该变量代表某一页的页数,因为歌曲的搜索结果具有不确定性,通过对搜索结果进行分页处理可以美化和规范网页内容。路由的HTTP请求由视图函数searchView负责接收和处理,在search的views.py中定义视图函数searchView。
1.2 视图定义
from django.shortcuts import render, redirect
from django.core.paginator import Paginator
from django.core.paginator import EmptyPage
from django.core.paginator import PageNotAnInteger
from django.shortcuts import reverse
from django.db.models import Q, F
from index.models import *def searchView(request, page):if request.method == 'GET':# 热搜歌曲searchs = Dynamic.objects.select_related('song').order_by('-search').all()[:6]# 获取搜索内容,如果kword为空,就查询全部歌曲kword = request.session.get('kword', '')if kword:songs = Song.objects.filter(Q(name__icontains=kword) | Q(singer=kword)).order_by('-release').all()else:songs = Song.objects.order_by('-release').all()[:50]# 分页功能paginator = Paginator(songs, 5)try:pages = paginator.page(page)except PageNotAnInteger:pages = paginator.page(1)except EmptyPage:pages = paginator.page(paginator.num_pages)# 添加歌曲搜索次数if kword:idList = Song.objects.filter(name__icontains=kword)for i in idList:dynamics = Dynamic.objects.filter(song_id=i.id)# 判断歌曲动态信息是否存在,若存在,则在原来的基础上加1if dynamics:dynamics.update(search=F('search') + 1)# 若动态信息不存在,则创建新的动态信息else:dynamic = Dynamic(plays=0, search=1, download=0, song_id=i.id)dynamic.save()return render(request, 'search.html', locals())else:# 处理POST请求,并重定向搜索页面request.session['kword'] = request.POST.get('kword', '')return redirect(reverse('search', kwargs={'page': 1}))
当视图函数searchView接收到路由search的POST请求后,它将执行歌曲搜索过程,执行过程说明如下:
(1)当用户在歌曲搜索框输入搜索内容并单击“搜索”按钮后,程序根据网页表单的属性action所指向的路由地址发送一个POST请求,Django接收到请求后,将请求信息交给视图函数searchView进行处理。
(2)如果视图函数searchView收到一个POST请求,那么首先将请求参数kword写入会话Session进行存储,请求参数kword是歌曲搜索框的搜索内容,然后以重定向的方式访问歌曲搜索页。
(3)通过重定向访问歌曲搜索页,等同于向歌曲搜索页发送一个GET请求,视图函数searchView首先获取会话Session的数据判断Session是否存在kword。
(4)如果kword存在,就以kword作为查询条件,分别在模型Song的字段name和singer中进行模糊查询,查询结果根据模型字段release进行降序排列;如果kword不存在,就查询模型Song的所有歌曲,以模型字段release进行降序排列,并且只获取前50首的歌曲信息。
(5)将查询结果进行分页处理,以每5首歌为一页的方式进行分页。函数参数page代表某一页的页数,它也代表路由变量page。
(6)根据搜索内容kword查找匹配的歌曲,将符合匹配条件的歌曲进行遍历和判断,如果歌曲的动态信息存在,就对该歌曲的搜索次数累加1,否则为歌曲新建一条动态信息,并将搜索次数设为1。
(7)最后将变量searchs和分页对象pages传递给模板文件search.html,由模板引擎进行解析并生成相应的网页内容。
1.3 模板定义
当模板文件search.html接收到变量searchs和分页对象pages后,模板引擎对模板语法进行解析并转换成网页内容。变量searchs实现歌曲搜索框下方的热搜歌曲,分页对象pages实现当前分页的歌曲列表歌分页导航功能。
{% extends "base.html" %}
{% load static %}
{% block link %}
<link rel="shortcut icon" href="{% static "favicon.ico" %}">
<link rel="stylesheet" href="{% static "css/common.css" %}">
<link rel="stylesheet" href="{% static "css/search.css" %}">
{% endblock %}{% block body %}
<body><div class="header"><a href="/" class="logo"><img src="{% static "image/logo.png" %}"></a><div class="search-box"><form id="searchForm" action="{% url 'search' 1 %}" method="post">{% csrf_token %}<div class="search-keyword"><input id="kword" name="kword" type="text" class="keyword" maxlength="120"/></div><input id="subSerch" type="submit" class="search-button" value="搜 索" /></form><div id="suggest" class="search-suggest"></div><div class="search-hot-words">{% for s in searchs %}<a target="play" href="{% url 'play' s.song.id %}" >{{ s.song.name }}</a>{% endfor %}</div></div></div><!--end header--><div class="nav-box"><div class="nav-box-inner"><ul class="nav clearfix"><li><a href="{% url 'index' %}">首页</a></li><li><a href="{% url 'ranking' %}" target="_blank">歌曲排行</a></li><li><a href="{% url 'home' 1 %}" target="_blank">用户中心</a></li></ul></div></div><!--end nav-box--><!--wrapper--><div class="wrapper clearfix" id="wrapper"><div class="mod_songlist"><ul class="songlist__header"><li class="songlist__header_name">歌曲</li><li class="songlist__header_author">歌手</li><li class="songlist__header_time">时长</li></ul><ul class="songlist__list">{% for p in pages.object_list %}<li class="js_songlist__child"><div class="songlist__item"><div class="songlist__songname"><span class="songlist__songname_txt"><a href="{% url 'play' p.id %}" class="js_song" target="play">{{ p.name }}</a></span></div><div class="songlist__artist"><a href="javascript:;" class="singer_name" >{{ p.singer }}</a></div><div class="songlist__time">{{ p.time }}</div></div></li>{% endfor %}</ul><div class="page-box"><div class="pagebar" id="pageBar">{% if pages.has_previous %}<a href="{% url 'search' pages.previous_page_number %}" class="prev" target="_self"><i></i>上一页</a>{% endif %}{% for p in pages.paginator.page_range %}{% if pages.number == p %}<span class="sel">{{ p }}</span>{% else %}<a href="{% url 'search' p %}" target="_self">{{ p }}</a>{% endif %}{% endfor %}{% if pages.has_next %}<a href="{% url 'search' pages.next_page_number %}" class="next" target="_self">下一页<i></i></a>{% endif %}</div></div></div></div>
</body>
{% endblock %}
相关文章:
27-Django项目实战(5)
1 歌曲搜索 音乐平台的每个网页顶部都设置了歌曲搜索功能,歌曲搜索框以网页表单的形式展示,并且以POST请求方式实现歌曲搜索功能,搜索结果显示在歌曲搜索页。歌曲搜索页由项目应用search实现,首先在search的urls.py中定义路由sea…...
【JVM】1. JVM与Java体系结构
文章目录 1.1. 前言🍉1.2. 参考书目🍉1.3. Java及JVM简介🍉1.4. Java发展的重大事件🍉1.5. 虚拟机与Java虚拟机🍉1.6. JVM的整体结构🍉1.7. Java代码执行流程🍉1.8. JVM的架构模型🍉…...
活动回顾|Kyligence x 亚马逊云科技,携手加速零售电商数智化转型
5月19日,Kyligence 与亚马逊云科技联合主办的「指标驱动,加速零售电商行业数智化转型」主题沙龙在上海成功举办。来自乐高、Kyligence、亚马逊云科技的专家分享了如何以数据和指标驱动,加速零售行业的数智化转型,并与现场观众进行…...
本科毕业生10大高薪专业出炉,IT行业赢麻了
据环球网报道,现在大学毕业生转行率高达80%! 非常后悔!有不少粉丝向播妞倾诉,曾经以为读了大学就能找到体面的工作,实际上是掉入了天坑专业,成了现实版孔乙己。 大学生找不到对口好工作,似乎已成…...
工厂安灯呼叫系统解决方案
在选择安灯呼叫系统之前,需要先了解自己的需求。不同的工厂可能有不同的需求,例如生产线的规模、生产过程中可能会出现的问题等。因此,选择安灯呼叫系统之前,需要先考虑自己的需求,以便选择到最适合自己的系统。要从多…...
微信xr-frame官方案例基础能力之渲染目标
前言:什么是渲染目标?(详见:RenderTarget-渲染目标) 在3D计算机图形领域,渲染目标是现代图形处理单元(GPU)的一个特征,它允许将3D场景渲染到中间存储缓冲区或渲染目标纹理…...
自动控制原理笔记-根轨迹法
目录 一,根轨迹的基本概念 1.根轨迹的基本概念 2.根轨迹方程 3.根轨迹方程的应用 二,根轨迹的绘制规则 【规则一】根轨迹有n条分支: 【规则二】根轨迹对称于实轴: 【规则三】根轨迹的起点和终点: 【规则四】…...
准备半个月,面试5分钟不到就凉了,问的实在太····
从外包出来,没想到竟然死在了另一家厂子 自从加入这家公司,每天都在加班,钱倒是给的不少,所以我也就忍了。没想到12月一纸通知,所有人都不许加班,薪资直降30%,顿时有吃不起饭的赶脚。 好在有个…...
基础IO(三)
软硬链接和动静态库 1.软硬链接2.动态库和静态库2.1理解现象2.2静态库的设计2.3动态库2.4动态库的配置2.5动态库的理解 🌟🌟hello,各位读者大大们你们好呀🌟🌟 🚀🚀系列专栏:【Linux…...
如何用国产DBDesginer软件进行数据库建模设计?
我们在开发软件系统之前都需要进行数据结构的建模设计,传统的都是通过PowerDesiger等国外的软件或直接Excel来进行数据库表结构设计,今天来了解一下如何使用国产软件来进行数据库建模设计 1、首先是注册DBDesigner用户( http://dbdesigner.n…...
精选 100 种最佳 AI 工具大盘点
为了应对对精简流程和数据分析日益增长的需求,整合人工智能工具在多个领域变得至关重要。 本文精选了2023年可用的100种最佳人工智能工具,旨在提高您的生产力、创造力和效率。 以下是 2023 年排名前 100 的人工智能工具: Aidoc:A…...
Recognizing Micro-Expression in Video Clip with Adaptive Key-Frame Mining阅读笔记
本文主要贡献 据我们所知,这是第一项旨在将视频剪辑中的信息时间子集的端到端学习与单个网络中的微表情识别相结合的工作。 此外,所提出网络中所有模块的设计都与输入视频剪辑的长度无关。 换句话说,网络容忍各种长度的微表情剪辑。 本文的贡…...
【SpringBoot整合RabbitMQ(上)】
一、简单的生产者-消费者 1.1、创建连接工具类获取信道 public class RabbitMqUtils {public static Channel getChannel() throws IOException, TimeoutException {//创建一个链接工厂ConnectionFactory factory new ConnectionFactory();//工厂IP 链接RabbitMQ的队列facto…...
Linux 设备驱动程序(二)
系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核(一) 深入理解 Linux 内核(二) Linux 设备驱动程序(一) Linux 设备驱动程序(二) Linux设备驱动开发详解 文章目录 系列文章目…...
性价比提升15%,阿里云发布第八代企业级计算实例g8a和性能增强型实例g8ae
5 月 17 日,2023 阿里云峰会常州站上,阿里云正式发布第八代企业级计算实例 g8a 以及性能增强性实例 g8ae。两款实例搭载第四代 AMD EPYC 处理器,标配阿里云 eRDMA 大规模加速能力,网络延时低至 8 微秒。其中,g8a 综合性…...
Unity VR开发教程 OpenXR+XR Interaction Toolkit 番外(一)用 Grip 键, Trigger 键和摇杆控制手部动画
文章目录 📕制作手部动画📕设置 Animation Controller📕添加触摸摇杆的 Input Action📕代码部分 在大部分 VR 游戏中,手部的动画通常是由手柄的三个按键来控制的。比如 Grip 键控制中指、无名指、小拇指的弯曲…...
H.265/HEVC编码原理及其处理流程的分析
H.265/HEVC编码原理及其处理流程的分析 H.265/HEVC编码的框架图,查了很多资料都没搞明白,各个模块的处理的分析网上有很多,很少有把这个流程串起来的。本文的主要目的是讲清楚H.265/HEVC视频编码的处理流程,不涉及复杂的计算过程。…...
数据结构初阶--链表OJⅡ
目录 前言相交链表思路分析代码实现 环形链表思路分析代码实现 环形链表Ⅱ思路分析代码实现 复制带随机指针的链表思路分析代码实现 前言 本篇文章承接上篇博客,继续对部分经典链表OJ题进行讲解 相交链表 先来看题目描述 思路分析 这道题我们还是首先来判断一…...
离职or苟住?
面对不太好的大环境,我们什么时候该离职,什么时候不应该离职呢?分享几个观点,希望对你有所启发。 以前就有大佬讲过,离职无非是两个原因,一是因为薪资不到位,二是因为受委屈了,总之&…...
微服务之以nacos注册中心,以gateway路由转发服务调用实例(第一篇)
实现以nacos为注册中心,网关路由转发调用 项目版本汇总项目初始化新建仓库拉取仓库项目父工程pom初始化依赖版本选择pom文件如下 网关服务构建pom文件启动类配置文件YMLnacos启动新建命名空间配置网关yml(nacos)网关服务启动 用户服务构建pom文件启动类配置文件YML新增url接口配…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
