Django实现音乐网站 ⒅

news2024/11/28 10:58:17

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

本篇主要为歌单列表、歌单详情及推荐页-歌单内容改动。

目录

歌单列表

设置路由

视图处理

模板渲染

歌单-单曲列表

设置路由

视图处理

模板渲染

推荐页-歌单列表

模板渲染修改

总结


歌单列表

可通过导航>歌单或者推荐歌单中分类跳转到歌单列表。

设置路由

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

视图处理

设置接收三个参数:

分页,设置默认为1;

分类id,设置默认为精选歌单;

排序规则,最新1,最热2;

def songsheet(request):
    """ 歌单列表 """

    page = request.GET.get('page', 1)
    cid = request.GET.get('cid', 1)
    # 排序 1最新 2最热
    sort = request.GET.get('sort', 1)
    if sort == 1:
        songsheets = SongSheet.objects.filter(category=cid).order_by('-addtime').all()
    else:
        songsheets = SongSheet.objects.filter(category=cid).order_by('playnum').all()
    # 实例化Paginator
    paginator = Paginator(songsheets, 20)

    try:
        res = paginator.page(page)
    except PageNotAnInteger:
        res = paginator.page(1)
    except EmptyPage:
        res = paginator.page(paginator.num_pages)

    list_num = len(res)

    cid = int(cid)
    # 歌单类型列表
    cates = SongCategory.categoryChoice
    cate_all = SongCategory.objects.order_by('id').all()
    return render(request, 'songsheet/index.html', locals())

说明:

对cid进行数值处理,是为了模板中if判断选中使用。

歌单类型列表在模板中的渲染分为了两部分:

1.父级类型2.所属子集类型;本来想在视图中处理为一个列表,发现模板中无法渲染,

最后只能全部传给模板,在父循环中再套一个循环判断是否为相应子集进行渲染操作。

模板渲染

内容如下:

{% extends 'common/base.html' %}
{% load static %}

{% block title %}我的音乐-歌单{% endblock title %}

{% block content %}
<link rel="stylesheet" href="{% static 'css/song_sheet.css' %}">

<!--导航条开始-->
<div class="header">
    <img src="{% static 'images/logo.png' %}" class="logo" alt="">
    <ul>
        <li><a href="{% url 'player:index' %}">推荐</a></li>
        <li><a href="javascript:void(0)">排行榜</a></li>
        <li><a href="{% url 'player:singer' 1 '#' %}">歌手</a></li>
        <li><a href="javascript:void(0)" class="selected">歌单</a></li>
    </ul>
</div>
<!--导航条结束-->

<!--歌单开始-->
<div class="song_sheet">
    <div class="title flex_c">
        <div class="name">推荐歌单 <i class="glyphicon glyphicon-menu-down" id="dian"></i></div>
        <div>
            {% if sort == '1' %}
                <a href="{% url 'player:songsheet' %}?sort=1&cid={{cid}}" class="active">最新</a>
                <a href="{% url 'player:songsheet' %}?sort=2&cid={{cid}}">最热</a>
            {% else %}
                <a href="{% url 'player:songsheet' %}?sort=1&cid={{cid}}">最新</a>
                <a href="{% url 'player:songsheet' %}?sort=2&cid={{cid}}" class="active">最热</a>
            {% endif %}
        </div>
    </div>
    <div class="tags_out" style="display: none;">
        <div class="tags">
            <ul>
                {% for item in cates %}
                <li class="item_list">
                    <p class="tip flex_c">
                        <i class="glyphicon glyphicon-bookmark"></i>
                        <span class="span_item" data-id="{{item.0}}">{{item.1}}</span>
                    </p>
                    <ul class="flex_c list_tags">
                        {% for v in cate_all %}
                        {% if v.pid == item.0 %}
                            {% ifequal cid v.id %}
                            <li class="item active">
                                <span class="span_item" data-id="{{v.id}}">
                                    <a href="{% url 'player:songsheet' %}?cid={{v.id}}">{{v.name}}</a>
                                </span>
                            </li>
                            {% else %}
                                <li class="item">
                                    <span class="span_item" data-id="{{v.id}}">
                                        <a href="{% url 'player:songsheet' %}?cid={{v.id}}">{{v.name}}</a>
                                    </span>
                                </li>
                            {% endifequal %}
                        {% endif %}
                        {% endfor %}
                    </ul>
                </li>
                {% endfor %}
            </ul>
        </div>
    </div>
    <div class="list">
        {% for son in res %}
        <div class="item">
            <div class="pic_out">
                <div class="cover"><span class="play icon_play">
                    <i class="glyphicon glyphicon-play"></i></span>
                </div>
                <img alt="" src="/media/{{ son.cover }}" class="pic" data-src="/media/{{ son.cover }}" lazy="loaded">
            </div>
            <p class="name">
                <span title="{{ son.name }}">
                    <a href="{% url 'player:songsheet_song' %}?id={{ son.id }}">{{ son.name }}</a>
                </span>
            </p>
            <p class="count" style="display:;"><i class="glyphicon glyphicon-play"></i> {{ son.playnum }}</p>
        </div>
        {% endfor %}
    </div>
    {% if list_num < 1 %}
    <!--设置无数据内容-->
    <div class="nodata flex_c">
        <div class="inner">
            <img src="{% static 'images/nodata.png' %}"
                 alt="" class="nodata_img">
            <div class="tip"><p>暂无相关数据</p></div>
        </div>
    </div>
    {% endif %}

    {% if list_num > 0 %}
    <!--设置分页页码-->
    <div class="page">
        <i class="li-page glyphicon glyphicon-menu-left notPointer"></i>
        <ul>
            {% for index in res.paginator.page_range %}
            {% if res.number == index %}
                <li><a href="#" class="notCursor currentPage">{{index}}</a></li>
            {% else %}
                <li><a href="{% url 'player:songsheet' %}?page={{index}}&cid={{cid}}&sort={{sort}}">{{index}}</a></li>
            {% endif %}
            {% endfor %}
        </ul>
        <i class="glyphicon glyphicon-menu-right li-page"></i>
    </div>
    {% endif %}
</div>
<!--歌单结束-->
{% endblock content %}
{% block styleJs %}
{# 子页面引入js文件 #}
<script>
    // 设置类型列表初始为隐藏状态
    var tags_out = $('.tags_out');

    // 失去焦点事件 隐藏类型列表
    $('body').click(function(e){
        var v = $(e.target);//获取当前点击事件的元素
       var nowClass = v.attr('class');
       console.log(nowClass)
       var tans = ["span_item", "glyphicon glyphicon-menu-down", "tags_out", "item_list", "tip flex_c", "item", "item active", "flex_c list_tags"];
       console.log(tans.indexOf(nowClass))
        if(tans.indexOf(nowClass) < 0) {
            $('#dian').removeClass('glyphicon-menu-up');
            $('#dian').addClass('glyphicon-menu-down');
            tags_out.hide();
        } else {
            $('#dian').removeClass('glyphicon-menu-down');
            $('#dian').addClass('glyphicon-menu-up');
            tags_out.show();
        }
        return true;
    });
</script>
{% endblock styleJs %}

说明:

最新、最热排序增加判断,选中效果并传递相应参数给视图,进行排序显示。

然后就是歌单类型渲染了,怎么渲染的及思路在视图处理时已做了说明,需要着重说的是,

这块费时不少:1.父子集合渲染;2.筛选条件判断选中;3.点击隐藏显示效果,需要点击相应元素打开列表,之后可以点打开元素关闭,也可以点空白处关闭。这部分功能,尝试了好几种方法,都不太理想,最后绑定body点击事件,给所点击元素做了个白名单,白名单内部的就打开歌单列表,否则就关闭。

效果:

 

歌单-单曲列表

也就是点击某个歌单后,跳转到歌单详情,展示歌单信息和所属歌单的单曲列表,有分页。

设置路由

path('songsheet/song', views.songsheet_song, name='songsheet_song'),

视图处理

视图处理较为简单,查询歌单信息,通过歌单与单曲外键获取相应的单曲列表;

进行分页处理,最后返回模板。

内容如下:

def songsheet_song(request):
    """ 歌单详情-单曲列表 """

    id = request.GET.get('id', 1)
    page = request.GET.get('page', 1)

    # 查询歌单信息
    info = SongSheet.objects.filter(id=id).first()
    # 歌单单曲列表
    song_list = info.singe.all()
    # 歌单类型
    categorys = info.category.values('name')
    # 实例化Paginator
    paginator = Paginator(song_list, 20)

    try:
        res = paginator.page(page)
    except PageNotAnInteger:
        res = paginator.page(1)
    except EmptyPage:
        res = paginator.page(paginator.num_pages)

    list_num = len(res)
    return render(request, 'songsheet/song.html', locals())

 

模板渲染

模板就更简单了,直接使用的专辑详情的页面模板,改一改部分内容显示,增加一个分页。

内容如下:

{% extends 'common/base.html' %}
{% load static %}

{% block title %}我的音乐-歌单{% endblock title %}

{% block content %}
<link rel="stylesheet" href="{% static 'css/album.css' %}">

<!--导航条开始-->
<div class="header">
    <img src="{% static 'images/logo.png' %}" class="logo" alt="">
    <ul>
        <li><a href="{% url 'player:index' %}">推荐</a></li>
        <li><a href="javascript:void(0)">排行榜</a></li>
        <li><a href="{% url 'player:singer' 1 '#' %}">歌手</a></li>
        <li><a href="javascript:void(0)" class="selected">歌单</a></li>
    </ul>
</div>
<!--导航条结束-->

<!--歌单内容开始-->
<div class="main_con">
    <div class="content">
        <div class="info_l">
            <div class="cover_out">
                <img src="/media/{{info.cover}}" alt="" class="cover" data-src="info.cover" lazy="loaded">
                <img src="{% static 'images/album_cover_record.png' %}" alt="" class="record">
            </div>
            <p class="intr">歌单简介 </p>
            <p class="intr_txt">
                {{info.desc}}...
            </p>
            <div><a href="javascript:;" class="download bg_primary">
                <i class="glyphicon glyphicon-download-alt"></i>&nbsp;下载该歌单</a>
            </div>
        </div>
        <!--歌单单曲列表开始-->
        <div class="info_r">
            <div loading-text="正在加载中...">
                <p class="song_name">{{info.name}}</p>
                <p class="artist_name"><span>{{info.single.name}}</span></p>
                <p class="song_info">
                    {% for c in categorys %}
                        <span>{{c.name}}</span>
                    {% endfor %}
                </p>
                <div class="btns">
                    <button class="play bg_primary">
                        <i class="glyphicon glyphicon-play"></i>&nbsp;<span>立即播放</span>
                    </button>
                    <button><i class="glyphicon glyphicon-plus"></i>&nbsp;<span>添加</span>
                    </button>
                    <button>
                        <i class="glyphicon glyphicon-heart"></i>&nbsp;<span>收藏</span>
                    </button>
                </div>
                <div>
                    <div class="list_head head_name_album">
                        <ul class="flex_c">
                            <li class="head_num">序号</li>
                            <li class="head_name">歌曲</li>
                            <li class="head_artist">歌手</li>
                            <li class="head_time">时长</li>
                        </ul>
                    </div>
                    <ul class="album_list">
                        {% for song in res %}
                            <li class="song_item flex_c">
                                <div class="song_rank flex_c">
                                    <div class="rank_num"><span>{{forloop.counter}}</span></div>
                                </div>
                                <div class="song_name flex_c">
                                    <a title="{{song.name}}" href="{% url 'player:album_song' %}?id={{info.id}}&sid={{song.id}}" class="name">{{song.name}}</a>
                                </div>
                                <div class="song_artist">
                                    <span title="{{song.singler.name}}">{{song.singler.name}}</span>
                                </div>
                                <div class="song_time"><span>{{song.get_song_duration}}</span></div>
                                <div class="song_opts flex_c">
                                    <i class="glyphicon glyphicon-plus"></i>
                                    <i class="glyphicon glyphicon-play"></i>
                                    <i class="glyphicon glyphicon-heart"></i>
                                </div>
                            </li>
                        {% endfor %}
                    </ul>
                </div>

                {% if info == False %}
                <!--设置无数据内容-->
                <div class="nodata flex_c">
                    <div class="inner">
                        <img src="{% static 'images/nodata.png' %}"
                             alt="" class="nodata_img">
                        <div class="tip"><p>暂无相关数据</p></div>
                    </div>
                </div>
                {% endif %}

                {% if list_num > 0 %}
                <!--设置分页页码-->
                <div class="page">
                    <i class="li-page glyphicon glyphicon-menu-left notPointer"></i>
                    <ul>
                        {% for index in res.paginator.page_range %}
                            {% if res.number == index %}
                                <li><a href="#" class="notCursor currentPage">{{index}}</a></li>
                            {% else %}
                                <li><a href="{% url 'player:singer' index %}">{{index}}</a></li>
                            {% endif %}
                        {% endfor %}
                    </ul>
                    <i class="glyphicon glyphicon-menu-right li-page"></i>
                </div>
                {% endif %}
            </div>
        </div>
        <!--歌单单曲列表结束-->
    </div>
</div>
<!--歌单内容结束-->
{% endblock content %}

 

推荐页-歌单列表

因为歌单功能已做完,现在可以把推荐页面的推荐歌单列表跳转改活。

增加:更多跳转到所有歌单列表;分类跳转总歌单列表相应分类;

歌单列表点击封面和歌单名称跳转到相应详情。

模板渲染修改

templates/index/index.html中推荐歌单块内容修改。

内容如下:

<div class="recommend_song_sheet">
    <div class="title">
        <div class="name">推荐歌单</div>
        <ul>
            <li><a href="{% url 'player:songsheet' %}" class="now">每日推荐</a></li>
            <li><a href="{% url 'player:songsheet' %}?cid=25">流行</a></li>
            <li><a href="{% url 'player:songsheet' %}?cid=8">网络</a></li>
            <li><a href="{% url 'player:songsheet' %}?cid=3">经典</a></li>
            <li><a href="{% url 'player:songsheet' %}?cid=33">欧美</a></li>
            <li><a href="{% url 'player:songsheet' %}">更多></a></li>
        </ul>
    </div>
    <div class="list">
        {% for son in songsheets %}
            <dl {% if forloop.counter == 1 %} class="one" {% endif %}>
                <dt>
                    <a href="{% url 'player:songsheet_song' %}?id={{son.id}}">
                        <img src="/media/{{ son.cover }}" alt="">
                    </a>
                </dt>
                <dd>
                    <p class="name">
                        <a href="{% url 'player:songsheet_song' %}?id={{song.id}}">{{ son.name }}</a>
                    </p>
                    <p class="count"><i class="glyphicon glyphicon-play"></i> {{ son.playnum }}</p>
                </dd>
            </dl>
        {% endfor %}
    </div>
</div>

总结

做完歌单列表,再做歌单详情有种水到渠成的快速。

关联的搜索查询,复杂的数据处理及复杂数据在模板中的渲染和选中判断,有些难度。

其他的都是一些简单的内容。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何批量将长视频分割成短视频?详细操作步骤一目了然

如果你需要将一个长视频分割成多个短视频&#xff0c;你可以使用固乔智剪软件来实现这一目标。以下是详细步骤&#xff1a; 1. 在浏览器中搜索并下载"固乔智剪软件"。这个软件是专门用于视频剪辑和处理的&#xff0c;它提供了许多实用的功能。 2. 进入软件主页&#…

外贸独立站哪家好?推荐的独立站建站平台?

如何选外贸独立站搭建系统&#xff1f;创建贸易网站的工具有哪些&#xff1f; 在如今全球贸易不断蓬勃发展的背景下&#xff0c;外贸独立站成为许多企业拓展国际市场的首选之一。然而&#xff0c;要想在竞争激烈的市场中脱颖而出&#xff0c;选择一家合适的外贸独立站服务提供…

error:03000086:digital envelope routines::initialization error问题解决

目录 问题描述&#xff1a;error:03000086:digital envelope routines::initialization error 问题原因&#xff1a;nodejs V17 版本发布了 OpenSSL3.0 对算法和秘钥大小增加了更为严格的限制&#xff0c;nodeJs v17 之前版本没影响&#xff0c;但 V17 和之后版本会出现这个错…

Learn Prompt-基础用法

基本法则​ 相比于搜索引擎&#xff0c;ChatGPT的优势在于其高效的想法关联和信息归纳能力。在进一步讲解提示的构建思路前&#xff0c;我希望你可以了解到两点通用的经验法则&#xff0c;用来提高生成AI模型的输出质量。其中包括 尝试提示的多种表述以获得最佳结果使用清晰简…

良好的测试环境应该怎么搭建?对软件产品起到什么作用?

为了确保软件产品的高质量&#xff0c;搭建一个良好的测试环境是至关重要的。在本文中&#xff0c;我们将从多个角度出发&#xff0c;详细描述良好的测试环境的搭建方法、注意事项以及对软件产品的作用。    一、软件测试环境的搭建   1、从硬件设备的选择与配置开始。对于…

大数据导论 四、JDK安装部署

1、下载JDK 官网 https://www.oracle.com/java/technologies/downloads/archive/ 下载 jdk-8u333-linux-x64.tar.gz 上传 2、解压 解压 3、配置环境变量 编辑文件 追加内容 保存并退出 刷新环境变量 4、验证

10分钟带你初步了解 Service Worker

是什么&#xff1f; 服务器与浏览器的中介持久的浏览器离线缓存 有什么用&#xff1f; 解放主线程&#xff0c;节省资源加载&#xff0c;提高浏览体验 其他描述 基于web worker&#xff0c;并在其基础上&#xff0c;增加了离线缓存的功能独立于当前网页线程&#xff08;后台…

3-D HANet:一种用于目标检测的柔性三维 HeatMap 辅助网络

论文背景 室外场景感知使用 Lidar&#xff1a; 1.点云数据不受天气(雾、风暴、雨和雪)的影响&#xff0c;支持稳定的环境感知&#xff1b; 2.点云数据在很大程度上保留了原来中物体的空间结构特征。 3D 目标检测是室外场景感知的重要组成部分。 从一个不完整的点云空间结构中…

如何快速在 Apache DolphinScheduler 新扩展一个任务插件?

作者 | 代立冬 编辑 | Debra Chen Apache DolphinScheduler 是现代数据工作流编排平台&#xff0c;具有非常强大的可视化能力&#xff0c;DolphinScheduler 致力于使数据工程师、分析师、数据科学家等数据工作者都可以简单轻松地搭建各种数据工作流&#xff0c;让数据处理流程…

使用Python绘制多个股票的K线图

K线图是金融领域常用的技术分析工具&#xff0c;可以洞察地展示股票的开盘价、收盘价、最高价和最低价等信息。在投资决策中&#xff0c;对多个股票的走势进行对比分析是非常重要的。随着金融市场的发展&#xff0c;投资者对于多种股票的对比分析需求越来越高。传统的方式是通过…

tokio::net学习

tokio::net 该模块包含TCP/UDP/Unix网络类型,类似于标准库,可用于实现网络协议。 networking protocols Organization TcpListener and TcpStream provide functionality for communication over TCP UdpSocket provides functionality for communication over UDP UnixLi…

信创办公–基于WPS的PPT最佳实践系列 (项目8创建电子相册)

信创办公–基于WPS的PPT最佳实践系列 &#xff08;项目8创建电子相册&#xff09; 目录 应用背景操作步骤 应用背景 如果我们想把图片弄成相册&#xff0c;或者弄成一段有音乐的视频分享给朋友。我们可以利用PPT来制作。那我们如何用PPT制作电子相册或视频呢&#xff1f;可以跟…

21天学会C++:Day13----动态内存管理

CSDN的uu们&#xff0c;大家好。这里是C入门的第十三讲。 座右铭&#xff1a;前路坎坷&#xff0c;披荆斩棘&#xff0c;扶摇直上。 博客主页&#xff1a; 姬如祎 收录专栏&#xff1a;C专题 目录 1. 加深对内存四区的理解 2. new-delete 与 malloc-free 2.1 能否用 fre…

Django:一、创建项目、APP及启动Django

一、准备工具 Pycharm企业版 二、创建项目 打开Pycharm企业版&#xff0c;创建Django项目。 注意&#xff1a;①删除项目下的templates文件夹&#xff1b;②删除setting.py文件中的一行代码 默认文件介绍&#xff1a; 三、创建APP 点击Pycharm左下角Terminal&#xff0c;打…

基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(四)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 数据增强3. 模型构建4. 模型训练及保存5. 模型评估6. 模型测试1&#xff09;权限注册2&#xff09;模型导入3&#xff09;总体模型构建4&#xff09;处理视频中的预览帧数据5&#xff09;处理图片数…

区块链技术:解密去中心化的革命

文章目录 区块链的基础概念什么是区块链&#xff1f;区块链的核心原理1. 分布式账本2. 区块3. 加密技术4. 共识机制 区块链的工作原理区块链的交易过程区块链的安全性共识机制的作用 区块链的应用领域1. 金融服务2. 供应链管理3. 物联网4. 医疗保健5. 政府与公共服务 区块链的未…

图像练习OpenCV(01)

提取出里面最大矩形的四个顶点坐标 源图像 结果展示 代码 void getLine(std::vector<int>& data, int threshold) {for (int x 0; x < data.size(); x){if (0 data[x]){continue;}int maxValue 0, maxLoc -1, i -1;for (i x; i < data.size(); i){if …

【2023集创赛】Arm杯二等奖作品:基于Arm Cortex-M3的体感节奏音乐游戏机

本文为2023年第七届全国大学生集成电路创新创业大赛&#xff08;“集创赛”&#xff09;安谋科技杯全国二等奖作品分享&#xff0c;参加极术社区的【有奖征集】分享你的2023集创赛作品&#xff0c;秀出作品风采&#xff0c;分享2023集创赛作品扩大影响力&#xff0c;更有丰富电…

跑腿系统开发:构建实时任务分配算法的技术挑战

在跑腿系统中&#xff0c;实时任务分配算法是确保任务快速高效完成的关键因素之一。本文将介绍构建实时任务分配算法时可能面临的技术挑战&#xff0c;并提供一个简单的Python示例来解决这些挑战。 技术挑战&#xff1a; 实时数据处理&#xff1a; 跑腿系统需要处理大量的实时任…

Ganache本地测试网+cpolar内网穿透实现公网访问内网

文章目录 前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar内网穿透3.2 创建隧道3.3 测试公网访问 4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子域名 前言 网&#xff1a;我们通常说的是互联网&am…