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)

总结

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

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

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

相关文章

计算机网络 网络层 IPv4地址

A类地址第一位固定0 B类10 其下同理

谈谈闭包和闭包使用场景

一、什么是闭包 概念:闭包还是作用域的一种特殊应用 二、触发闭包的情况 1.函数当做返回值被返回 2.函数当做参数被传递 3.自执行匿名函数 //情况1:函数当做返回值被返回 function fn(){const a 1;return function(){console.log(a) //1}; } const a …

平替 Docker - 玩转容器新利器 Podman Desktop (视频)

《OpenShift 4.x HOL教程汇总》 在 podman-desktop 1.2.1 podman 4.4 环境中验证。 文章目录 什么是 podman 和 podman-desktop安装 podman 和 podman-desktop 基本环境Image、Container 和 Pod 的基本操作拉取 Image运行 Container 将 Pod 部署到 Kubernetes安装 Kind 扩展插…

UI美工设计的主要职责(合集)

UI美工设计的主要职责1 职责: 1、执行公司的规章制度及专业管理办法; 2、 负责重点项目的原型设计和产品流程设计、视觉设计,优化网站和移动端的设计流程和规范,制定产品 UI/UE规范及文档编写; 3、负责使用PS、AI、illustrator、MarkMan、…

什么是Node js?什么是React?有什么区别

JavaScript是当今最流行的编程语言之一,它用于开发多种技术,两种这样的技术是Node.js和React。许多学生很难理解Nodejs和React之间的区别。 React和Nodejs之间的主要区别在于它们的使用位置。Nodejs 用于开发应用程序的服务器端,而Reactjs用于…

体验自制免费开源闯关学SQL

文章目录 前言mac安装nodejs启动体验 前言 sql是常用必不可少的一种语言,我们都或有各种各样的学习经历,最近看鱼皮大佬开源了一款自制的闯关学SQL项目,该项目是纯前端语言,不需要太多依赖以及前置知识,直接下载就可以…

golang协程池库tunny实践

前言 线程池大家都听过,其主要解决的是线程频繁创建销毁带来的性能影响,控制线程数量。 go协程理论上支持百万协程并发,协程创建调度的消耗极低,但毕竟也是消耗对吧。 而且协程池可以做一些额外的功能,比如限制并发&…

解决ElementUI动态表单校验验证不通过

这里记录一下&#xff0c;写项目时遇到的一个问题&#xff1a;就是动态渲染的表单项&#xff0c;加验证规则后一直不通过&#xff01;&#xff01;&#xff01; 原代码 html部分&#xff1a; <el-form-itemv-for"(teaclass,index) in addFom.classIds":label&quo…

[Mongodb 5.0]单机启动

安装完mongodb后&#xff0c;会自动生成下面两个目录(mongod.conf中设定的)&#xff0c;用来存放日志和数据 /var/lib/mongo (数据目录) /var/log/mongodb (日志目录) 要启动一个单机版的mongodb&#xff0c;一般有两种方式&#xff1a; 第一种启动方式&#xff1a;直接使用…

Go Gin 中使用 JWT

一、JWT JWT全称JSON Web Token是一种跨域认证解决方案&#xff0c;属于一个开放的标准&#xff0c;它规定了一种Token实现方式&#xff0c;目前多用于前后端分离项目和OAuth2.0业务场景下。 二、为什么要用在你的Gin中使用JWT 传统的Cookie-Sesson模式占用服务器内存, 拓展性…

Autoware.ai1.14.0自动驾驶-Demo运行

Autoware.ai1.14.0自动驾驶-Demo运行 数据准备 下载数据&#xff1a; wget https://autoware-ai.s3.us-east-2.amazonaws.com/sample_moriyama_data.tar.gz wget https://autoware-ai.s3.us-east-2.amazonaws.com/sample_moriyama_150324.tar.gz一定要注意解压文件是在.auto…

mac arm 通过brew搭建 php+nginx+mysql+xdebug

1.安装nginx brew install nginx //安装brew services start nginx //启动2.安装php brew install php7.4 //安装export PATH"/opt/homebrew/opt/php7.4/bin:$PATH" //加入环境变量 export PATH"/opt/homebrew/opt/php7.4/sbin:$PATH"brew serv…

RFID技术应用于服饰市场

RFID技术应用于服饰市场 RFID技术已广泛应用于服饰制造加工行业&#xff0c;为企业提供了许多实用的解决方案。下面是一些常见的应用场景&#xff1a; 库存管理&#xff1a;RFID标签可以被缝制或附着在服装上&#xff0c;通过RFID读写器进行扫描。企业可以实时跟踪和管理库存…

在QT及VS运行包含opencv的cmakelists实例

本文分享如何利用QT和Visual Studio运行cmake组织管理的程序&#xff0c;也就是运行cmakelists.txt。 main和cmakelists内容 main和cmakelists文件路径如下&#xff1a; main.cpp #include<opencv2/opencv.hpp> #include<iostream> #include <string> usi…

重启服务器引发的Docker异常

公司使用云服务器需要硬盘扩容&#xff0c;服务器重启才生效。 重启以后发现拉取远程镜像的命令登录失败了&#xff01; 然后发现找不到容器和镜像列表了&#xff0c;但是容器都启动了。 查看docker运行状态都是正常的 systemctl is-active docker systemctl status docker.…

【flink】Chunk splitting has encountered exception

执行任务报错&#xff1a; Chunk splitting has encountered exception 错误信息截图&#xff1a; 完整的错误信息&#xff1a; 16:30:43,911 ERROR org.apache.flink.runtime.source.coordinator.SourceCoordinator [SourceCoordinator-Source: CDC Sourceorg.jobslink.flink…

开启想象翅膀:轻松实现文本生成模型的创作应用,支持LLaMA、ChatGLM、UDA、GPT2、Seq2Seq、BART、T5、SongNet等模型,开箱即用

开启想象翅膀&#xff1a;轻松实现文本生成模型的创作应用&#xff0c;支持LLaMA、ChatGLM、UDA、GPT2、Seq2Seq、BART、T5、SongNet等模型&#xff0c;开箱即用 TextGen: Implementation of Text Generation models 1.介绍 TextGen实现了多种文本生成模型&#xff0c;包括&a…

web-csrf

目录 CSRF与XSS的区别&#xff1a; get请求 原理&#xff1a; pikachu为例 post请求 pikachu为例 CSRF与XSS的区别&#xff1a; CSRF是借用户的权限完成攻击&#xff0c;攻击者并没有拿到用户的权限&#xff0c;而XSS是直接盗取到了用户的权限 get请求 原理&#xff1a;…

15-1_Qt 5.9 C++开发指南_Qt多媒体模块概述

多媒体功能指的主要是计算机的音频和视频的输入、输出、显示和播放等功能&#xff0c;Qt 的多媒体模块为音频和视频播放、录音、摄像头拍照和录像等提供支持&#xff0c;甚至还提供数字收音机的支持。本章将介绍 Qt 多媒体模块的功能和使用。 文章目录 1. Qt 多媒体模块概述2. …

时间序列预测任务下探索深度学习参数对模型预测性能的影响

时间序列相关的项目在我之前的很多博文中都有涉及&#xff0c;覆盖的数据领域也是比较广泛的&#xff0c;很多任务或者是项目中往往是搭建出来指定的模型之后就基本完成任务了&#xff0c;比较少去通过实验的维度去探索分析不同参数对模型性能的影响&#xff0c;这两天正好有时…