Django实现音乐网站 ⒀
使用Python Django框架制作一个音乐网站,
本篇主要是推荐页-推荐排行榜、推荐歌手功能开发。
目录
推荐页开发
推荐排行榜
单曲表增加播放量
表模型增加播放量字段
执行表操作
模板中显示外键对应值
表模型外键设置
获取外键对应模型值
推荐排行榜视图
推荐排行榜模板
推荐歌手
推荐歌手视图
推荐歌手模板
总结
推荐页开发
推荐排行榜
排行榜这个功能后期在做吧,比较麻烦,目前先做一个模拟的排行榜数据返回。
单曲表增加播放量
做歌曲排行榜才发现歌曲表没有播放量字段。
表模型增加播放量字段
在player/models.py单曲表中增加播放量字段。
内容如下:
playnum = models.IntegerField(default=0, editable=False)
执行表操作
python manage.py makemigrations
python manage.py migrate
执行过程

模板中显示外键对应值
在模板中显示外键对应值很关键,在python中有特殊的方法,开始时我还是按照以前的方式去显示,即先获取A表模型中所有名称组成一个一维的列表,然后获取B表模型数据,在一个循环中使用B模型与A模型对应外键,取相应值并赋值,最终组成一个新的二维对象类型数据返回给模版,结果模版解析不了二维对象。
之后直接返回A模型所有名称的一维列表,在模板的for循环中使用B表模型中对应A模型外键直接解析,还是不行!
最终在网上找了好多文章,才从其中一个找到端倪;其实这个问题一点也不复杂,因为Django中已经给做好了,不用再做关键模型赋值操作,其他文章没写是因为一旦会了就不觉得是问题,但是不会真的百思不得其解,在这里记录一下吧。
表模型外键设置
# 设置与歌手表关联外键 一对多外键设置在多的模型中
singler = models.ForeignKey("Singler",on_delete=models.CASCADE,verbose_name='歌手',help_text='请选择歌手'
)
获取外键对应模型值
{% for hot in hot_ranks %}{{ hot.singler.name }}
{% endfor %}
推荐排行榜视图
在原来的推荐歌单数据查询下增加推荐排行榜查询处理。
def index(request):""" 显示首页 """......# 推荐排行榜# 热歌榜 取播放量最多的五个hot_ranks = Singe.objects.order_by('-playnum').all()[0:5]# 新歌榜 取最新的五个new_ranks = Singe.objects.order_by('-id').all()[0:5]# 飙升榜biao_ranks = Singe.objects.order_by('id').all()[0:5]# 欧美榜ea_ranks = Singe.objects.order_by('-id').all()[0:5]# 日韩榜js_ranks = Singe.objects.order_by('id').all()[0:5]return render(request, 'index/index.html', {'carousels': carousel_imgs,'songsheets': songsheets,'hot_ranks': hot_ranks,'new_ranks': new_ranks,'biao_ranks': biao_ranks,'ea_ranks': ea_ranks,'js_ranks': js_ranks})
推荐排行榜模板
<!--推荐排行榜开始-->
<div class="recommend_rank"><div class="title"><div class="name">推荐排行榜</div><ul><li><a href="#">更多></a></li></ul></div><div class="list"><div class="bank"><div class="bank_top"><div class="img"><img class="img_tip" src="{% static 'images/b1.png' %}" alt=""></div><img class="img_bg" src="{% static 'images/b1_1.jpg' %}" alt=""></div><ul class="bank_list">{% for hot in hot_ranks %}<li>{% if forloop.counter == 1 %}<div class="top_img top1"></div>{% elif forloop.counter == 2 %}<div class="top_img top2"></div>{% elif forloop.counter == 3 %}<div class="top_img top3"></div>{% else %}<div class="top_index">{{forloop.counter}}</div>{% endif %}<div class="top_info"><p class="song_name">{{ hot.name }}</p><p class="singler">{{ hot.singler.name }}</p></div></li>{% endfor %}</ul></div><div class="bank"><div class="bank_top"><div class="img"><img class="img_tip" src="{% static 'images/b2.png' %}" alt=""></div><img class="img_bg" src="{% static 'images/b2_2.jpg' %}" alt=""></div><ul class="bank_list">{% for news in new_ranks %}<li>{% if forloop.counter == 1 %}<div class="top_img top1"></div>{% elif forloop.counter == 2 %}<div class="top_img top2"></div>{% elif forloop.counter == 3 %}<div class="top_img top3"></div>{% else %}<div class="top_index">{{forloop.counter}}</div>{% endif %}<div class="top_info"><p class="song_name">{{ news.name }}</p><p class="singler">{{ news.singler.name }}</p></div></li>{% endfor %}</ul></div><div class="bank"><div class="bank_top"><div class="img"><img class="img_tip" src="{% static 'images/b3.png' %}" alt=""></div><img class="img_bg" src="{% static 'images/b3_3.jpg' %}" alt=""></div><ul class="bank_list">{% for biao in biao_ranks %}<li>{% if forloop.counter == 1 %}<div class="top_img top1"></div>{% elif forloop.counter == 2 %}<div class="top_img top2"></div>{% elif forloop.counter == 3 %}<div class="top_img top3"></div>{% else %}<div class="top_index">{{forloop.counter}}</div>{% endif %}<div class="top_info"><p class="song_name">{{ biao.name }}</p><p class="singler">{{ biao.singler.name }}</p></div></li>{% endfor %}</ul></div><div class="bank"><div class="bank_top"><div class="img"><img class="img_tip" src="{% static 'images/b4.png' %}" alt=""></div><img class="img_bg" src="{% static 'images/b4_4.jpg' %}" alt=""></div><ul class="bank_list">{% for ea in ea_ranks %}<li>{% if forloop.counter == 1 %}<div class="top_img top1"></div>{% elif forloop.counter == 2 %}<div class="top_img top2"></div>{% elif forloop.counter == 3 %}<div class="top_img top3"></div>{% else %}<div class="top_index">{{forloop.counter}}</div>{% endif %}<div class="top_info"><p class="song_name">{{ ea.name }}</p><p class="singler">{{ ea.singler.name }}</p></div></li>{% endfor %}</ul></div><div class="bank"><div class="bank_top"><div class="img"><img class="img_tip" src="{% static 'images/b5.png' %}" alt=""></div><img class="img_bg" src="{% static 'images/b5_5.jpg' %}" alt=""></div><ul class="bank_list">{% for jss in js_ranks %}<li>{% if forloop.counter == 1 %}<div class="top_img top1"></div>{% elif forloop.counter == 2 %}<div class="top_img top2"></div>{% elif forloop.counter == 3 %}<div class="top_img top3"></div>{% else %}<div class="top_index">{{forloop.counter}}</div>{% endif %}<div class="top_info"><p class="song_name">{{ jss.name }}</p><p class="singler">{{ jss.singler.name }}</p></div></li>{% endfor %}</ul></div></div>
</div>
<!--推荐排行榜结束-->
推荐歌手
先定一个规则,取单曲最多的六位歌手。
推荐歌手视图
返回单曲最多的六位歌手,还是在原来的基础上增加歌手的查询并返回给模板。
代码如下:
def index(request):""" 显示首页 """......# 推荐歌手 取单曲最多的六个singlers = Singler.objects.order_by('-singe_num').all()[0:6]return render(request, 'index/index.html', {'carousels': carousel_imgs,'songsheets': songsheets,'hot_ranks': hot_ranks,'new_ranks': new_ranks,'biao_ranks': biao_ranks,'ea_ranks': ea_ranks,'js_ranks': js_ranks,'singlers': singlers})
推荐歌手模板
模板样式都已经写好了,只需要在循环中解析和赋值就可以了。
代码如下:
<!--推荐歌手开始-->
<div class="recommend_singler"><div class="title"><div class="name">推荐歌手</div><ul><li><a class="now" href="#">华语</a></li><li><a href="#">欧美</a></li><li><a href="#">日韩</a></li><li><a href="#">组合</a></li><li><a href="#">更多></a></li></ul></div><div class="list">{% for sg in singlers %}<div class="item"><div class="cover"><img src="/media/{{sg.portrait}}" alt=""></div><p class="name">{{sg.name}}</p><p class="num">{{sg.singe_num}}首歌曲</p></div>{% endfor %}</div>
</div>
<!--推荐歌手结束-->
总结
做推荐页开发暂时就这样了还是比较顺利的,只有在外键显示那边费了点事,还是对django部分不了解才导致的,这也是做项目的目的,能够比较全面的使用框架的功能,增进对框架的了解。
相关文章:
Django实现音乐网站 ⒀
使用Python Django框架制作一个音乐网站, 本篇主要是推荐页-推荐排行榜、推荐歌手功能开发。 目录 推荐页开发 推荐排行榜 单曲表增加播放量 表模型增加播放量字段 执行表操作 模板中显示外键对应值 表模型外键设置 获取外键对应模型值 推荐排行榜视图 推…...
PySide6学习笔记--基础环境的安装配置
PySide6介绍 QT官方发布Qt6.0之后,紧接着于2020年12月10日发布了PySide 6,对应C版的Qt6。从PySide6开始,PySide的命名也会与Qt的大版本号保持一致。需要注意的是使用PySide6开发的程序在默认情况下,不兼容Windows7系统,…...
算法通关村第九关——中序遍历与搜索树
1 中序遍历和搜索树原理 二叉搜索树按照中序遍历正好是一个递增序列。其比较规范的定义是: 若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值;若它的右子树不为空,则右子树所有节点的值均大于它的根节点的值&…...
测试框架pytest教程(5)运行失败用例-rerun failed tests
# content of test_50.py import pytestpytest.mark.parametrize("i", range(50)) def test_num(i):if i in (17, 25):pytest.fail("bad luck") 运行这个文件,2个失败,48个通过。 要运行上次失败的测试用例,可以使用--l…...
【车载开发系列】UDS当中的时间参数
【车载开发系列】UDS当中的时间参数 UDS当中的时间参数 【车载开发系列】UDS当中的时间参数一. 术语定义二. 网络层时间调整参数三. ECU诊断层与会话层参数 一. 术语定义 缩写全称中文说明BSBlock Size块大小STminSeparation time min时间间隙SIService Identifier服务标识符S…...
PDF中的表格怎么转换为Excel?这两个工具一定得收藏!
PDF是一种常见的文件格式,它可以保持文件的原始样式和内容,但是也有一些缺点,比如不易编辑和处理数据。如果你想要将PDF中的表格或数据导出到Excel中,以便进行分析、计算或制作图表,那么你可能需要一个专业的PDF转Exce…...
ssh scp sshpass
ssh命令用于远程连接主机 ssh usernamehostname更多用法参考: ssh常用用法 scp 命令是用于通过 SSH 协议安全地将文件复制到远程系统和从远程系统复制文件到本地的命令 比如: scp /data/log/a.txt root192.168.1.100:/data/log该命令就就将本地的a.t…...
leetcode 1996. 游戏中弱角色的数量(排序的魅力)
题目 题意: 给定n个人的攻击力和防御力,对于一个人来说,如果存在某个人的攻击力和防御力都比他高,那么称这个人为弱角色。统计弱角色的数量 思路: 排序,攻击力按从大到小排序,这样遍历的时候某个数时前边的攻击力都比他…...
从头到尾说一次 Spring 事务管理(器) | 京东云技术团队
事务管理,一个被说烂的也被看烂的话题,还是八股文中的基础股之一。 本文会从设计角度,一步步的剖析 Spring 事务管理的设计思路(都会设计事务管理器了,还能玩不转?) 为什么需要事务管理&…...
php 系列题目,包含查看后端源代码
一、弱类型比较问题 原则: 1.字符串和数字比较,字符串回被转换成数字。 "admin" 0(true) admin被转换成数字,由于admin是字符串,转换失败,变成0 int(admin)0,所以比较结果是ture 2.混合字符串转…...
令牌桶C语言代码实现
令牌桶实例 令牌桶三要素 cps 每秒钟传输字节数 burst 令牌桶内最多能传输的字节数,token的最大值 token 令牌的个数 之前是一个令牌(token)对应一个字节,现在将一个token变为一个cps,cps是解码速率,每攒到一个令牌ÿ…...
Mybatis 建立依赖失败:报错Dependency ‘mysql:mysql-connector-java:8.0.28‘ not found
Mybatis 建立依赖失败:报错Dependency ‘mysql:mysql-connector-java:8.0.28’ not found 解决办法: 写完依赖代码,直接重构,下载依赖。 图片: 和 UUID(Universally Unique Identifier)都是用于生成唯一标识符的方法,但它们在实现和适用场景上存在一些区别。 雪花算法: 雪花算法是Twitter开发的一种分布式ID生成算法…...
docker之DockerFile与网络
目录 DockerFile 构建步骤 基础知识 指令 实战:构建自己的centos 第一步:编写dockerfile文件 第二步:构建镜像文件 docker网络 原理 功能 网络模式 host模式 container模式 none模式 bridge模式 DockerFile dockerfile 是用来…...
知识蒸馏开山之作(部分解读)—Distilling the Knowledge in a Neural Network
1、蒸馏温度T 正常的模型学习到的就是在正确的类别上得到最大的概率,但是不正确的分类上也会得到一些概率尽管有时这些概率很小,但是在这些不正确的分类中,有一些分类的可能性仍然是其他类别的很多倍。但是对这些非正确类别的预测概率也能反…...
centos 7 安装 docker-compose curl 设置代理
sudo curl -x “http://192.168.1.2:3128” 需要验证的代理 sudo curl -x “http://username:password192.168.1.2:3128” 1.下载 sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/lo…...
程序员转行学习 AI 大模型: 提示词工程 | 附精选学习资料
本文是程序员转行学习AI大模型的第12个核心知识点笔记,笔记后附精选的提示词工程学习资料。 当前阶段:还在学习知识点,由点及面,从 0 到 1 搭建 AI 大模型知识体系中。 系列更新,关注我,后续会持续记录分享…...
MyBatis 中 CDATA 的实战应用与避坑指南
1. 为什么MyBatis需要CDATA 在MyBatis的日常开发中,我们经常需要在XML映射文件中编写SQL语句。但XML本身对特殊字符有着严格的限制,比如小于号(<)、大于号(>)、和号(&)等字符在XML中都有特殊含义。这就导致了一个很现实的问题:当我…...
深度解析ConcurrentHashMap设计演进:从分段锁到无锁化的并发之路
在Java并发编程领域,ConcurrentHashMap绝对是“并发容器扛鼎之作”——它既解决了HashMap并发环境下的数据不一致(死循环、数据丢失)问题,又突破了Hashtable全表锁的性能瓶颈,成为高并发场景下K-V存储的首选。自JDK1.5…...
Arco design vue 表格排序踩坑
父组件:<template><div class"p-10"><!-- 商户管理 --><div class"invate-box placeholder:"><div class"flex items-center"><SvgIcon :name"user"></SvgIcon><div class&q…...
Java 四种安全加载 P12 证书的方案
文章目录从文件绝对路径加载【最常用、最稳定】从 resources 目录加载从 byte [] 字节数组加载从 Base64 字符串加载如果文章对您有用,请关注点赞加收藏,博主会持续更新相关的专栏笔记🫡 从文件绝对路径加载【最常用、最稳定】 适合…...
【Git技巧】git rebase -i 实战:轻松合并本地提交记录
1. 为什么你需要掌握git rebase -i 每次写完代码提交时,你是不是也经常遇到这种情况:刚提交完就发现有个拼写错误,赶紧又提交一次;或者调试过程中反复提交了好几次"临时保存"。结果git log一看,提交记录乱七…...
知识引导上下文优化(KgCoOp):一种解决灾难性遗忘的 Prompt Tuning 机制
来源:DeepHub IMBA 本文约3000字,建议阅读5分钟本文提出了一种简单有效的约束机制。视觉-语言模型(VLMs)如 CLIP 彻底改变了零样本图像识别的处理方式。这类模型在包含 4 亿个图像-文本对的大规模数据集上进行训练,捕获…...
别再傻傻用软件SPI了!STM32F407驱动ST7789屏,用HAL库+DMA2_Stream3实现丝滑刷屏
STM32F407硬件SPIDMA驱动ST7789屏幕的极致性能优化实战 如果你正在使用STM32F407驱动ST7789屏幕,并且对刷新率不满意,这篇文章将带你从"能用"到"高效"的蜕变。我们将深入探讨三种驱动方案的性能差异,并重点解析如何通过D…...
嵌入式设备文件传输协议解析与实践
嵌入式设备文件传输协议深度解析与应用实践1. 文件传输协议概述1.1 传统串口文件传输协议Xmodem协议族作为经典的串口文件传输解决方案,在嵌入式领域已有数十年的应用历史。该协议通过串口实现设备间的可靠数据传输,采用校验和或CRC校验机制确保数据完整…...
告别Makefile!用Zig 0.10.0自带的构建系统搞定ARM裸机开发(附完整项目配置)
用Zig构建系统重塑ARM裸机开发:告别Makefile的终极指南 当你在凌晨三点盯着第47个Makefile规则调试链接器错误时,是否想过——嵌入式开发必须这么痛苦吗?Zig 0.10.0带来的不仅是一门新语言,更是一套彻底革新裸机开发工作流的构建系…...
