当前位置: 首页 > news >正文

Django实现音乐网站 ⑻

使用Python Django框架制作一个音乐网站,

本篇主要是后台对单曲原有功能的基础上进行部分功能实现和显示优化。

目录

新增编辑

歌手下拉显示修改

设置歌曲时长

安装eyed3库

获取mp3时长

歌曲时长字段修改

重写save方法

增加歌手单曲数量

查询歌手单曲数量

列表显示

显示歌手名称

获取歌手名称

设置歌手名称显示

列表显示歌曲时长

单曲表模型整体

总结


新增编辑

歌手下拉显示修改

新增时选择歌手显示为对象,无法确认歌手。

需修改Singler表模型,增加__str__方法

内容如下:

def __str__(self):""" 修改返回格式 """return self.name

 效果:

设置歌曲时长

歌曲时长的值从输入框填写改为后台设置为读取歌曲文件获取的时长。

安装eyed3库

命令如下:

pip install eyed3

获取mp3时长

内容如下:

import eyed3def get_duration_mp3(file_path):""" 获取mp3音频文件时长 """info = eyed3.load(file_path)return info.info.time_secs

歌曲时长字段修改

修改Singe Model类

首先把歌曲时长字段设置为admin不可改写。

duration = models.IntegerField(editable=False)

重写save方法

在重写save方法的内部,需要先调取父类保存方法后文件会被保存到相应路径,

之后才会有文件路径,读取MP3文件获取文件时长后,再存储一次;至于简单的方法因为对django还在学习中,暂时没发现。

def save(self, force_insert=False, force_update=False, using=None,update_fields=None):""" 重写save方法 处理歌曲时长 """super().save()#get_singe_singler_num(self.singler)path_name = str(self.path.name)if path_name.endswith(".mp3"):save_path = os.path.join(settings.MEDIA_ROOT, path_name)print(save_path)self.duration = get_duration_mp3(save_path)print(self.duration)super().save()

增加歌手单曲数量

需要在增加相应歌手关联单曲时同时增加该歌手的单曲数量。

查询歌手单曲数量

在player/models.py中新增方法,通过单曲表歌手外键id查询相应歌手拥有单曲数量。

内容如下:

def get_singe_singler_num(singler_id):"""获取单曲表中所属歌手数:param singler_id::return:"""return Singe.objects.filter(singler_id=singler_id).count()

同步歌手单曲数量

单曲保存时处理歌手单曲数量,修改单曲表模型save方法,在最后保存前增加处理。

内容如下:

def save(self, force_insert=False, force_update=False, using=None,update_fields=None):""" 重写save方法 处理歌曲时长 歌手单曲数量 """super().save()path_name = str(self.path.name)if path_name.endswith(".mp3"):save_path = os.path.join(settings.MEDIA_ROOT, path_name)self.duration = get_duration_mp3(save_path)# 获取相应歌手单曲数singe_num = get_singe_singler_num(self.singler_id)# 更新相应歌手的单曲数Singler.objects.filter(pk=self.singler_id).update(singe_num=singe_num)super().save()

列表显示

显示歌手名称

单曲列表关联歌手外键id,如果需要显示歌手名称,也需要修改否则只显示外键id。

获取歌手名称

在player/admin.py中设置方法,通过外键id去查询相应歌手信息。

内容如下:

def get_singler_name(id):"""获取歌手名称:param id:歌手id:return:"""return Singler.objects.get(pk=id)

设置歌手名称显示

修改后台单曲类中外键字段自定义显示处理。

class SingeAdmin(admin.ModelAdmin):""" 后台单曲类 """......def get_singler_id(self):return get_singler_name(self.singler_id)get_singler_id.short_description = '歌手'

效果:

列表显示歌曲时长

修改后台单曲类,增加显示歌曲时长字段。

def get_duration(self):return self.durationget_duration.short_description = '时长(s)'# 显示字段
list_display = ['id', get_name, get_singler_id, get_duration, get_addtime, get_updatetime]

单曲表模型整体

class Album(BaseModel):""" 专辑表 """class Meta:verbose_name = '专辑'verbose_name_plural = '专辑'name = models.CharField('专辑名称', max_length=50, help_text='请输入专辑名称')cover = models.ImageField('专辑封面', upload_to=upload_save_path, help_text='请上传专辑封面图')desc = models.CharField('专辑描述', max_length=255, help_text='请输入专辑描述')single_num = models.IntegerField(default=0, editable=False)langs = [('国语', '国语'), ('普通话', '普通话'), ('英语', '英语'), ('日韩', '日韩')]single_lang = models.CharField('专辑语种', max_length=50, choices=langs, help_text='请选择专辑语种')# 设置与歌手表关联外键 一对多singler = models.ForeignKey("Singler", on_delete=models.CASCADE, verbose_name='歌手', help_text='请选择歌手')# 设置与单曲表关联外键 多对多Singe = models.ManyToManyField('Singe', verbose_name='单曲', help_text='请选择单曲')def save(self, force_insert=False, force_update=False, using=None,update_fields=None):""" 重写save方法 处理单曲数和歌手专辑数 """# 获取选中的单曲字典sing_set = self.Singe.all()single_num = len(sing_set)# 更新单曲数self.single_num = single_num# 获取所属歌手专辑数album_num = get_album_singler_num(self.singler_id)super().save()# 更新歌手表-专辑数Singler.objects.filter(pk=self.singler_id).update(album_num=album_num)

总结

对后台单曲模块进行部分功能优化,主要通过新增编辑和列表两方面来进行优化。

相关文章:

Django实现音乐网站 ⑻

使用Python Django框架制作一个音乐网站, 本篇主要是后台对单曲原有功能的基础上进行部分功能实现和显示优化。 目录 新增编辑 歌手下拉显示修改 设置歌曲时长 安装eyed3库 获取mp3时长 歌曲时长字段修改 重写save方法 增加歌手单曲数量 查询歌手单曲数量 …...

VScode中同时打开两个脚本

使用快捷键: CtrlAltRightArrow 效果: 可以看到,上述两个脚本使用独立的窗口进行编辑和查看。...

能源电力工程师专属Python学习资料

随着我国新型电力系统的建设,一方面电源侧各类新能源装机快速增长,对于新能源出力的功率预测需求日益增长;另一方面,我国电力市场经过 8 年建设,关于电力商品价格影响因素的研究亟待深入。超过 90% 的业务小伙伴都具备…...

推荐5款实用软件,提高工作效率,丰富生活乐趣

​ 分享软件会让我感到开心和满足,因为我知道这些软件可以提高工作效率,丰富生活乐趣。今天再次将几款非常实用的软件推荐给大家。 截图翻译工具——CopyTranslator ​ CopyTranslator是一款非常实用的截图翻译软件,它支持对截图、选定区域进行OCR文字识别,自动翻…...

Python爬虫在电商数据挖掘中的应用

作为一名长期扎根在爬虫行业的专业的技术员,我今天要和大家分享一些有关Python爬虫在电商数据挖掘中的应用与案例分析。在如今数字化的时代,电商数据蕴含着丰富的信息,通过使用爬虫技术,我们可以轻松获取电商网站上的产品信息、用…...

element-ui 表格el-table的列内容溢出省略显示,鼠标移上显示全部和定制样式

1、在对应列加上省略显示show-overflow-tooltip属性&#xff0c;如果加上这属性&#xff0c;鼠标移上还是没效果&#xff0c;要考滤是不是层级的原因&#xff0c;被其他挡住了。 :deep(.el-tooltip){position: relative;z-index:9; } <el-table-column label"用款渠…...

研究人员发现特斯拉汽车能被越狱,可免费解锁付费功能

Bleeping Computer 网站披露&#xff0c;柏林工业大学&#xff08;Technical University of Berlin&#xff09;的研究人员开发出一种新技术&#xff0c;可以破解特斯拉近期推出所有车型上使用的基于 AMD 的信息娱乐系统&#xff0c;并使其运行包括付费项目在内的任何软件。 实…...

【设计模式】责任链的基本概念及使用Predicate灵活构造校验链

文章目录 1. 概述1.1.背景1.2.责任链模式的概念 2.责任链的基本写法2.1.链表实现2.2.数组实现 3.Predicate校验链2.1.使用Predicate改写代码2.1.更丰富的条件拓展 4.总结 1. 概述 1.1.背景 在最近的开发中遇到了这么一个需求&#xff0c;需要对业务流程中的各个参数做前置校验…...

Taro保存图片到手机

萌新亚历山大啊&#xff0c;搞了一下午&#xff0c;真多坑 Taro.downloadFile({url: res,filePath: Taro.env.USER_DATA_PATH /xcxcode.jpg,success: res > {if (res.statusCode 200) {console.log(res)const tempFilePath res.filePath; // 获取下载的临时文件路径// …...

zookeeper --- 基础篇

一、zookeeper简介 1.1、什么是zookeeper zookeeper官网&#xff1a;https://zookeeper.apache.org/ 大数据生态系统里的很多组件的命名都是某种动物或者昆虫&#xff0c;他是用来管 Hadoop&#xff08;大象&#xff09;、Hive(蜜蜂)、Pig(小 猪)的管理员。顾名思义就是管理…...

Golang map 常用方法

文章目录 前言按key排序按value排序统计字符串中元素重复出现次数并将结果排序返回 前言 由于map是无序的&#xff0c;所以排序成 slice 返回&#xff0c;且都使用泛,代码只是示例&#xff0c;省略了错误判断 按key排序 package mainimport "fmt"func example[T c…...

用于视觉跟踪的在线特征选择研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Docker基本使用

查看本地镜像 查看本地&#xff1a;docker imagesPull镜像&#xff1a;docker pull nginx:latest登录镜像&#xff1a;docker login hub.docker.com -u **** -p ****制作镜像&#xff1a;docker build -t xxxx:v1push&#xff1a;docker push xxx:v1删除镜像:docker rmi #imag…...

PHP生成随机数

要在 PHP 中生成随机密码&#xff0c;可以使用 rand() 函数和字符串操作函数。以下是一个示例代码来生成包含字母、数字和特殊字符的随机密码 function generateRandomPassword($length 8) {// 定义包含字母、数字和特殊字符的字符集$characters abcdefghijklmnopqrstuvwxyz…...

MongoDB:Unrecognized option: storage

MongoDB一直显示 Unrecognized option: storage try ‘mongod --help’ for more information 意思是我们配置的config文件出了问题。 说明&#xff1a;MongoDB采用的是YAML格式&#xff0c;所以我们只需要稍微改改就好。 在storage前面&#xff1a;没有空格 下面两行最前面…...

Java基础九 - 异常

1. throw 和 throws 1. throw是在代码运行过程中引起一个异常 2. throws是将异常声明但是不处理&#xff0c;而是将异常往上传&#xff0c;谁调用我就交给谁处理 2. final、finally、finalize 1. final是修饰符&#xff0c;用于修饰变量、方法、类修饰变量&#xff0c;最开始…...

[国产MCU]-BL602开发实例-UART数据发送与接收

UART数据发送与接收 文章目录 UART数据发送与接收1、BL602的UART介绍2、UART相关驱动API介绍3、UART使用示例3.1 轮询方式数据接收与发送3.2 中断方式数据接收与发送3.3 DMA方式接收与发送数据通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,通常称为UART)…...

mac安装open3d时候出现错误

在测试open3d是否正常顺利安装时&#xff0c;出现了如下错误&#xff1a; python -c "import open3d as o3d; print(o3d.__version__)" Traceback (most recent call last):File "<string>", line 1, in <module>File "/Users/huangzhe/…...

打造本地户外装备小程序商城教程大揭秘

在如今的移动互联网时代&#xff0c;小程序已经成为了各行各业的发展利器。尤其对于户外用具行业来说&#xff0c;一个专属的小程序商城将能够极大地提升企业的品牌形象和销售业绩。下面就来介绍一下快速上手制作户外用具小程序的攻略吧。 首先&#xff0c;登录乔拓云平台进入商…...

在外SSH远程连接Ubuntu系统

在外SSH远程连接Ubuntu系统【无公网IP】 文章目录 在外SSH远程连接Ubuntu系统【无公网IP】前言1. 在Ubuntu系统下安装cpolar软件2. 完成安装后打开cpolar客户端web—UI界面3. 创建隧道取得连接Ubuntu系统公网地址4. 打开Windows的命令界面并输入命令 前言 随着科技和经济的发展…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...