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

Django实现音乐网站 ⒇

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

本篇音乐播放器-添加播放音乐功能实现。

目录

创建播放器数据表

设置表结构

 执行创建表

命令

执行

数据表结构

添加单个歌曲

创建路由

加入播放器视图

模板处理

基类方法

子页面调用

优化弹窗

加入layui文件

基类模板引入layui

修改弹窗

添加歌单全部歌曲

设置路由

视图处理

模板添加方法

脚本方法

按钮调用

添加专辑全部歌曲

设置路由

视图处理

模板添加方法

脚本方法

按钮调用

总结


创建播放器数据表

设置表结构

在player/models.py中设置播放器表(Player)结构。

内容如下:

class Player(BaseModel):""" 播放器表 """name = models.CharField('单曲名称', max_length=100)# 与单曲表多对多关系singe = models.ForeignKey('Singe', on_delete=models.CASCADE)singler = models.ForeignKey("Singler", on_delete=models.CASCADE)

 

 执行创建表

命令

python manage.py makemigrations
python manage.py migrate

执行

数据表结构

添加单个歌曲

创建路由

# 歌曲添加播放器
path('add_play', views.add_play, name='add_play'),

加入播放器视图

查询相应单曲信息,之后通过单曲与歌手外键id查询相应歌手记录,

建立播放器表与歌手关联。

def add_play(request):""" 添加歌曲到播放器 """# 查询相应单曲id = request.GET.get('id')info = Singe.objects.filter(pk=id).first()if info:# 加入到播放列表中singerDb = Singler.objects.filter(id=info.singler_id).first()# 新增单曲playDb = Player()playDb.name = info.name# 建立关联playDb.singe = infoplayDb.singler = singerDbplayDb.save()return JsonResponse({'status': 1, 'msg': '添加“%s”成功!' % info.name})

模板处理

在基类模板文件中添加脚本方法,其他子页面调用此方法进行添加。

基类方法

使用jquery get方法请求视图,并弹窗视图处理结果。

<script>// 歌曲添加播放器
function add_player(id){$. get("/add_play", {'id':id}, function (msg) {alert(msg.msg)});
}</script>

子页面调用

在图标上设置点击事件触发添加播放器方法。

<div class="song_opts flex_c"><i class="glyphicon glyphicon-plus" onclick="add_player({{song.id}})"></i><i class="glyphicon glyphicon-play"></i><i class="glyphicon glyphicon-heart"></i>
</div>

效果:

优化弹窗

之前的弹窗太难看,换成layui的弹窗。

加入layui文件

使用layui的弹窗,下载layui文件引入到static文件夹中。

基类模板引入layui

在base.html中引入layui的css和js文件。

<link rel="stylesheet" href="{% static 'css/layui.css' %}">
<script src="{% static 'js/layui.js' %}"></script>

 

修改弹窗

弹窗脚本修改,引入layui的脚本。

layui.use(['layer', 'form'], function(){var layer = layui.layer;
});// 歌曲添加播放器
function add_player(id){$. get("/add_play", {'id':id}, function (msg) {layer.msg(msg.msg, {icon: 6});});
}

优化后效果:

添加歌单全部歌曲

在歌单-单曲列表中可以添加专辑所有歌曲到播放器列表。

设置路由

path('songsheet_player', views.songsheet_player, name='songsheet_player'),

 

视图处理

传递歌单id,查询符合条件的一条专辑记录;

清空当前播放器列表数据;

通过外键关联获取所有单曲列表,循环中添加单曲到播放器列表中。

def songsheet_player(request):""" 添加歌单全部歌曲到播放器 """# 查询歌单信息id = request.GET.get('id')info = SongSheet.objects.filter(pk=id).first()if info:# 歌单单曲列表song_list = info.singe.all()if song_list:# 清除掉当前播放列表歌曲Player.objects.all().delete()# 添加歌单中所有歌曲for item in song_list:# 加入到播放列表中singerDb = Singler.objects.filter(id=item.singler_id).first()# 新增单曲playDb = Player()playDb.name = item.name# 建立关联playDb.singe = itemplayDb.singler = singerDbplayDb.save()res = {'status': 1, 'msg': '添加“%s”全部歌曲成功!' % info.name}else:res = {'status': 0, 'msg': '该歌单不存在,无法添加!'}return JsonResponse(res)

 

模板添加方法

脚本方法

设置添加歌单全部歌曲到播放器的方法,需要传递歌单id。

{% block styleJs %}
{# 子页面引入js文件 #}
<script>
// 添加歌单全部歌曲到播放器
function songsheet_player(id){$. get("/songsheet_player", {'id':id}, function (msg) {if(msg.status == 1) {layer.msg(msg.msg, {icon: 6});} else {layer.msg(msg.msg, {icon: 5});}});
}
</script>
{% endblock styleJs %}

 

按钮调用
<button onclick="album_player({{info.id}})"><i class="glyphicon glyphicon-plus"></i>&nbsp;<span>添加</span>
</button>

 

添加专辑全部歌曲

在歌单-单曲列表中可以添加专辑所有歌曲到播放器列表。

设置路由

path('album_player', views.album_player, name='album_player'),

视图处理

传递专辑id,查询符合条件的一条专辑记录;

清空当前播放器列表数据;

通过外键关联获取所有单曲列表,循环中添加单曲到播放器列表中。

def album_player(request):""" 添加专辑全部歌曲到播放器 """# 查询歌单信息id = request.GET.get('id')info = Album.objects.filter(pk=id).first()if info:# 歌单单曲列表song_list = info.singe.all()if song_list:# 清除掉当前播放列表歌曲Player.objects.all().delete()# 添加歌单中所有歌曲for item in song_list:# 加入到播放列表中singerDb = Singler.objects.filter(id=item.singler_id).first()# 新增单曲playDb = Player()playDb.name = item.name# 建立关联playDb.singe = itemplayDb.singler = singerDbplayDb.save()res = {'status': 1, 'msg': '添加“%s”全部歌曲成功!' % info.name}else:res = {'status': 0, 'msg': '该歌单不存在,无法添加!'}return JsonResponse(res)

模板添加方法

脚本方法

设置添加专辑全部歌曲到播放器的方法,需要传递歌单id。

{% block styleJs %}
{# 子页面引入js文件 #}<script>
// 添加专辑全部歌曲到播放器
function album_player(id){$. get("/album_player", {'id':id}, function (msg) {if(msg.status == 1) {layer.msg(msg.msg, {icon: 6});} else {layer.msg(msg.msg, {icon: 5});}});
}
</script>
{% endblock styleJs %}

 

按钮调用
<button onclick="songsheet_player({{info.id}})"><i class="glyphicon glyphicon-plus"></i>&nbsp;<span>添加</span>
</button>

总结

本篇主要是音乐播放器部分功能实现,与页面歌单、专辑、单曲联动操作。

相关文章:

Django实现音乐网站 ⒇

使用Python Django框架做一个音乐网站&#xff0c; 本篇音乐播放器-添加播放音乐功能实现。 目录 创建播放器数据表 设置表结构 执行创建表 命令 执行 数据表结构 添加单个歌曲 创建路由 加入播放器视图 模板处理 基类方法 子页面调用 优化弹窗 加入layui文件 基…...

C++类对象所占内存空间大小分析

前言 类占内存空间是只类实例化后占用内存空间的大小&#xff0c;类本身是不会占内存空间的。用 sizeof 计算类的大小时&#xff0c;实际上是计算该类实例化后对象的大小。空类占用1字节原因&#xff1a;C要求每个实例在内存中都有一个唯一地址&#xff0c;为了达到这个目的&am…...

绿肥红瘦专栏数据的爬取

前言 要想爬专栏&#xff0c;先得爬用户。要想爬用户&#xff0c;三个header参数挡住了去路&#xff1a;x-zst-81&#xff0c;x-zse-93&#xff0c;x-zse-96&#xff0c;经过搜索x-zse-96&#xff0c;定位到设置该字段的位置&#xff1a; 这个t2是固定的值&#xff0c;t0来自于…...

centos或aws linux部署java应用,环境搭建shell

目录 设置root密码开启密码登录安装docker安装nginx设置nginx自启动nginx配置https配置http集群tcp集群 安装docker设置docker自启动修改docker基础配置创建docker网关docker安装mysql单机版本主从版本 docker安装redis设置密码&#xff1a;不要密码&#xff1a; docker安装rab…...

2023年中国车用冲压模具行业特征、竞争现状及行业市场规模分析[图]

汽车冲压件模具具有尺寸大、型面复杂、精度要求高等特点&#xff0c;属于技术密集型产品。汽车冲压模具能快速精密地把材料直接加工成零件或半成品并通过焊接、铆接、拼装等工艺装配成零部件&#xff0c;冲压模具的设计开发和加工能力对汽车冲压零部件产品总制造成本、质量及性…...

基于Pytorch的CNN手写数字识别

作为深度学习小白&#xff0c;我想把自己学习的过程记录下来&#xff0c;作为实践部分&#xff0c;我会写一个通用框架&#xff0c;并会不断完善这个框架&#xff0c;作为自己的入门学习。因此略过环境搭建和基础知识的步骤&#xff0c;直接从代码实战开始。 一.下载数据集并加…...

Java设计模式之观察者模式(Observer Pattern)

观察者模式&#xff08;Observer Pattern&#xff09;是一种常用的软件设计模式&#xff0c;它用于在对象之间建立一种一对多的依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;它的所有依赖对象都会得到通知并自动更新。观察者模式属于行为型模式。 在观察者模式…...

最优化:建模、算法与理论(最优性理论2

5.7 约束优化最优性理论应用实例 5.7.1 仿射空间的投影问题 考虑优化问题 min ⁡ x ∈ R n 1 2 ∣ ∣ x − y ∣ ∣ 2 2 , s . t . A x b \min_{x{\in}R^n}\frac{1}{2}||x-y||_2^2,\\ s.t.{\quad}Axb x∈Rnmin​21​∣∣x−y∣∣22​,s.t.Axb 其中 A ∈ R m n , b ∈ R m …...

redis一主一从搭建

1.复制一份redis.conf并将6380都改成6379 [redist3-dtpoc-dtpoc-web06 conf]$ cp redis.conf redis_6380.conf [redist3-dtpoc-dtpoc-web06 conf]$ vi redis_6380.conf port 6380 daemonize yes pidfile "/home/redis/redis/logs/redis_6380.pid" logfile "/hom…...

【MySql】8- 实践篇(六)

文章目录 1. MySql保证主备一致1.1 MySQL 主备的基本原理1.2 binlog 的三种格式对比1.3 循环复制问题 2. MySql保证高可用2.1 主备延迟2.2 主备延迟的来源2.3 可靠性优先策略2.4 可用性优先策略 3. 备库为何会延迟很久-备库并行复制能力3.1 MySQL 5.6 版本的并行复制策略3.2 Ma…...

Spring篇---第七篇

系列文章目录 文章目录 系列文章目录一、说说事务的传播级别二、Spring 事务实现方式三、Spring框架的事务管理有哪些优点一、说说事务的传播级别 Spring事务定义了7种传播机制: PROPAGATION_REQUIRED:默认的Spring事物传播级别,若当前存在事务,则加入该事务,若 不存在事务…...

2023年中国轮胎模具需求量、竞争格局及行业市场规模分析[图]

轮胎模具是轮胎生产线中的硫化成形装备&#xff0c;是高技术含量、高精度及高附加值的个性化模具产品&#xff0c;尤其是轮胎的花纹、图案、字体以及其他外观特征的成形都依赖于轮胎模具&#xff0c;因此其制造技术难度较高。其主要功能是通过所成型材料&#xff08;主要是橡塑…...

集成学习方法(随机森林和AdaBoost)

释义 集成学习很好的避免了单一学习模型带来的过拟合问题 根据个体学习器的生成方式&#xff0c;目前的集成学习方法大致可分为两大类&#xff1a; Bagging(个体学习器间不存在强依赖关系、可同时生成的并行化方法) 流行版本&#xff1a;随机森林(random forest)Boosting(个体…...

PeopleCode中Date函数的用法

语法 Date(date_num) 描述 The Date function takes a number in the form YYYYMMDD and returns a corresponding Date value. If the date is invalid, Date displays an error message. Date函数输入是一个形如“YYYYMMDD”的数字&#xff0c;返回一个相应的Date类型的值…...

解决 el-tree setChecked 方法偶尔失效的方法

目前在大多数公司中&#xff0c;菜单的权限控制都是不可或缺的功能 在和后端配合做权限控制的时候不可避免的会用到 el-tree 然而这个组件本身带的坑不少 我们需要回显对应角色拥有的菜单&#xff0c;在不严格的模式下&#xff0c;父节点的选中会连带子节点的选中 如果 &a…...

重磅发布!RflySim Cloud 智能算法云仿真平台亮相,助力大规模集群算法高效训练

RflySim Cloud智能算法云仿真平台&#xff08;以下简称RflySim Cloud平台&#xff09;是由卓翼智能及飞思实验室为无人平台集群算法验证、大规模博弈对抗仿真、人工智能模型训练等前沿研究领域研发的平台。主要由环境仿真模块、物理效应计算模块、多智能体仿真模块、分布式网络…...

C++ 01.学习C++的意义-狄泰软件学院

一些历史 UNIX操作系统诞生之初是用汇编语言编写的随着UNIX系统的发展&#xff0c;汇编语言的开发效率成为瓶颈&#xff0c;所以需要一个新的语言替代汇编语言1971年通过对B语言改良&#xff0c;使其能直接产生机器代码&#xff0c;C语言诞生UNIX使用C语言重写&#xff0c;同时…...

微软正式发布开源应用平台 Radius平台

“ 10 月 18 日&#xff0c;微软 Azure 孵化团队正式发布开源应用平台 Radius&#xff0c;该平台将应用程序置于每个开发阶段的中心&#xff0c;重新定义应用程序的构建、管理与理解方式。” 简单的概括就是&#xff0c;它和Kubernetes不一样&#xff0c;Radius将应用程序放在每…...

排序算法(python)

排序算法 冒泡排序 一次比较相邻的两个数&#xff0c;每轮之后末尾的数字是确定的。 时间复杂度为 O ( n 2 ) O(n^2) O(n2)&#xff0c;空间复杂度为 O ( 1 ) O(1) O(1)&#xff0c;稳定。 def BUB(nums):for i in range(len(nums)):count 0for j in range(len(nums)-i-1)…...

一款简单漂亮的WPF UI - AduSkin

前言 经常会有同学会问&#xff0c;有没有好看简单的WPF UI库推荐的。今天就给大家推荐一款简单漂亮的WPF UI&#xff0c;融合多个开源框架组件&#xff1a;AduSkin。 WPF是什么&#xff1f; WPF 是一个强大的桌面应用程序框架&#xff0c;用于构建具有丰富用户界面的 Windo…...

如何禁用 WordPress 区块主题默认的跳转链接(skip-link)输出

...

OceanBase-Desktop-Setup-1.0.0.exe

Microsoft Windows [版本 10.0.19045.6456] (c) Microsoft Corporation。保留所有权利。C:\Users\Administrator>wsl --status 此应用程序需要适用于 Linux 的 Windows 子系统可选组件。 通过运行安装它&#xff1a; wsl.exe --install --no-distribution 可能需要重新启动系…...

为什么你的VSCode日志插件总失效?揭秘Node.js/Python/Java项目中87.6%的路径解析失败根源

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;VSCode 日志插件的核心价值与典型失效场景 VSCode 日志插件&#xff08;如 Log File Highlighter、Log Viewer 或 Output Colorizer&#xff09;通过语法高亮、时间戳解析、关键词过滤与折叠等功能&…...

Weka机器学习实战:7天掌握核心技巧与应用

1. Weka机器学习迷你课程概述Weka作为一款开源的机器学习工具集&#xff0c;已经成为了学术界和工业界入门机器学习的经典选择。这套迷你课程的设计初衷&#xff0c;是帮助学习者在最短时间内掌握Weka的核心功能和应用技巧。不同于市面上冗长的教程&#xff0c;我们聚焦于"…...

TX141F 双极锁存型霍尔位置传感器

产品特点 ● 双极锁存型霍尔效应传感器 ● 宽的工作电压范围: 3.8V~30V ● 集电极开路输出 ● 最大输出灌电流&#xff1a;50mA ● 电源反极性保护 ● 工作温度&#xff1a;-40℃~125℃ ● 封装形式: SIP3L(TO92S) 典型应用 ● 直流无刷电机 ● 位置控制 ● 安全报警装置 ● 转…...

逆向与爬虫实战:手把手教你用mitmproxy+MuMu模拟器抓取APP数据(Python脚本入门)

移动端数据抓取实战&#xff1a;从零构建mitmproxy与MuMu模拟器的自动化抓包系统 在移动互联网时代&#xff0c;应用数据抓取已成为开发者必备的核心技能之一。无论是进行竞品分析、接口调试&#xff0c;还是构建自动化测试流程&#xff0c;能够精准捕获并解析APP的网络请求都显…...

头歌 | MapReduce实战演练 — 电信通话记录清洗与去重

1. MapReduce与电信数据处理初探 电信运营商每天产生的通话记录数据量庞大到难以想象。想象一下&#xff0c;一个中等规模的省级运营商&#xff0c;每天可能产生数千万条通话记录&#xff0c;每条记录包含主叫号码、被叫号码、通话时间、通话时长、归属地等十多个字段。这些原始…...

终极指南:解决AeroSpace终端窗口尺寸异常的完整方案

终极指南&#xff1a;解决AeroSpace终端窗口尺寸异常的完整方案 【免费下载链接】AeroSpace AeroSpace is an i3-like tiling window manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ae/AeroSpace AeroSpace是一款为macOS设计的i3-like平铺窗口管理器…...

C++ 多态编程与纯虚函数详解

C++ 多态编程与纯虚函数详解 多态(Polymorphism)是面向对象编程的核心特性之一,它允许同一接口表现出不同的行为。C++ 支持编译时多态(静态多态)和运行时多态(动态多态)。本文重点讲解运行时多态,以及实现它的关键工具——虚函数与纯虚函数。 一、多态的基本概念 静态…...

【嵌入式】轻量级命令行交互实战:nr_micro_shell在资源受限MCU上的移植与优化

1. 为什么选择nr_micro_shell&#xff1f; 在嵌入式开发中&#xff0c;调试和维护是绕不开的环节。想象一下&#xff0c;当你需要实时查看某个传感器的数值&#xff0c;或者临时调整某个参数时&#xff0c;如果每次都要重新烧录程序&#xff0c;那效率得多低啊&#xff01;这时…...