Django实现音乐网站 ⒂

这篇具有很好参考价值的文章主要介绍了Django实现音乐网站 ⒂。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

本篇主要是歌手详情页-基本信息、单曲列表功能开发实现内容。

目录

歌手基本信息

增加路由

显示视图

模板显示

推荐歌手跳转详情

歌手增加基本信息

表模型增加字段

数据表更新

基本信息增加内容渲染

歌手单曲列表

路由设置

跳转设置

视图方法

模板内容

模板公共头信息

单曲列表页面内容

计算歌曲时长

表模型增加方法

模板中使用表模型方法

总结


歌手基本信息

增加路由

需要设置参数歌手id。

path('singer/detail/<int:id>', views.singer_detail, name='singer_detail'),

显示视图

查询歌手表模型,通过id查询响应歌手信息。

def singer_detail(request, id):
    """ 歌手详情-基本信息 """

    info = Singler.objects.get(pk=id)

    return render(request, 'singer/detail.html', {'info': info})

模板显示

设置样式和在模板基础上改为视图中传递的歌手信息。

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

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

{% block content %}
<link rel="stylesheet" href="{% static 'css/singer_detail.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="javascript:void(0)" class="selected">歌手</a></li>
        <li><a href="{% url 'player:singer' %}">单曲</a></li>
        <li><a href="javascript:void(0)">歌单</a></li>
    </ul>
</div>
<!--导航条结束-->

<!--歌手预告开始-->
<div class="singer">
    <div class="singer_bg"></div>
    <div class="singer_info flex_c">
        <div class="singer_cover">
            <img src="/media/{{info.portrait}}" alt="">
        </div>
        <div class="info">
            <p class="flex_c"><span class="name">{{info.name}}</span></p>
            <div class="info_items">
                <span>单曲:<span class="num">{{info.singe_num}}</span></span>
                <span>专辑:<span class="num">{{info.album_num}}</span></span>
                <span>粉丝:<span class="num">100W</span></span>
            </div>
            <div class="singer_items flex_c">
                <p>
                    <span>生日:<span>{{info.birthday}}</span></span>
                    <span>身高:<span>{{info.height}}cm</span></span>
                    <span>体重:<span>{{info.weight}}kg</span></span>
                    <span>星座:<span>{{info.constellation}}...</span></span>
                </p>
                <span class="all"><a href="{% url 'player:singer_detail' info.id %}">全部</a> > </span>
            </div>
            <div class="btns">
                <button class="play"><i class="glyphicon glyphicon-play"></i>&nbsp;&nbsp;播放全部歌曲</button>
                <button><i class="glyphicon glyphicon-heart"></i>&nbsp;&nbsp;收藏</button>
            </div>
        </div>
    </div>
</div>
<!--歌手预告结束-->

<!--歌手资料开始-->
<div class="main_con">
    <div class="con_l">
        <ul class="tabs flex_c">
            <li>
                <span class=""><a href="{% url 'player:singer_song' 1 %}">单曲</a></span>
                <span class=""><a href="{% url 'player:singer_album' 1 %}">专辑</a></span>
                <span class="active">简介</span>
            </li>
        </ul>
        <div class="child_view">
            <p class="tit">基本信息</p>
            <div class="list_info">
                <div class="info_list flex_c">
                    <div class="item_l">
                        <span>姓名:<span class="text">{{info.name}}</span></span>
                    </div>
                    &nbsp;
                    <div class="item_r">
                        <span>英文名:<span class="text">-</span></span>
                    </div>
                </div>
                <div class="info_list flex_c">
                    <div class="item_l">
                        <span>性别:<span class="text">男</span></span>
                    </div>
                    &nbsp;
                    <div class="item_r">
                        <span>国籍:<span class="text">中国香港</span></span>
                    </div>
                </div>
                <div class="info_list flex_c">
                    <div class="item_l">
                        <span>生日:<span class="text">{{info.birthday}}</span></span>
                    </div>
                    &nbsp;
                    <div class="item_r">
                        <span>星座:<span class="text">{{info.constellation}}</span></span>
                    </div>
                </div>
                <div class="info_list flex_c">
                    <div class="item_l">
                        <span>身高:<span class="text">{{info.height}}cm</span></span>
                    </div>
                    &nbsp;
                    <div class="item_r">
                        <span>体重:<span class="text">{{info.weight}}kg</span></span>
                    </div>
                </div>
            </div>
            <p class="tit">个人简介</p>
            <p class="info">{{info.desc|safe}}</p>
        </div>
    </div>
</div>
<!--歌手资料结束-->
{% endblock content %}

 

推荐歌手跳转详情

在推荐页中推荐歌手增加跳转到歌手详情-基本信息页面的链接设置。

<div class="item">
    <div class="cover">
        <img src="/media/{{sg.portrait}}" alt="">
    </div>
    <p class="name"><a href="{% url 'player:singer_detail' sg.id %}">
{{sg.name}}</a></p>
    <p class="num">{{sg.singe_num}}首歌曲</p>
</div>

 

歌手增加基本信息

表模型增加字段

player/models.py中歌手表模型增加英文名、国籍、性别字段。

内容如下:

english_name = models.CharField(
    '英文名',
    max_length=50,
    help_text='请输入歌手英文名',
    default='-'
)
gender = models.IntegerField(
    '性别',
    help_text='请选择歌手性别',
    choices=((0, '女'), (1, '男')),
    default=1
)
country_name = models.CharField(
    '国籍',
    max_length=50,
    help_text='请输入歌手国籍',
    default='-'
)
数据表更新

 同样还要创建表迁移文件,然后执行更新表结构。

python manage.py makemigrations
python manage.py migrate

效果如下:

Django实现音乐网站 ⒂,# Django项目,django,python,后端

 

基本信息增加内容渲染

表字段增加以后,对原来的歌手信息进行补录,最后对新增的信息进行模板渲染。

内容如下:

<div class="child_view">
    <p class="tit">基本信息</p>
    <div class="list_info">
        <div class="info_list flex_c">
            <div class="item_l">
                <span>姓名:<span class="text">{{info.name}}</span></span>
            </div>
            &nbsp;
            <div class="item_r">
                <span>英文名:<span class="text">{{info.english_name}}</span></span>
            </div>
        </div>
        <div class="info_list flex_c">
            <div class="item_l">
                <span>性别:<span class="text">
                    {% if info.gender %}
                        男
                    {% else %}
                        女
                    {% endif %}
                </span></span>
            </div>
            &nbsp;
            <div class="item_r">
                <span>国籍:<span class="text">{{info.country_name}}</span></span>
            </div>
        </div>

歌手单曲列表

路由设置

需要设置参数歌手id、分页page。

path('singer/song/<int:id>/<int:page>', views.singer_song, name='singer_song'),

跳转设置

在歌手详情中单曲切换设置跳转链接。

<span class=""><a href="{% url 'player:singer_song' info.id 1 %}">单曲</a></span>

视图方法

还是先获取全部列表,然后传给分页组件得到分页条数。

def singer_song(request, id, page):
    """ 歌手详情-单曲列表 """

    # 歌手基本信息
    info = Singler.objects.get(pk=id)

    # 单曲列表
    song_list = Singe.objects.filter(singler_id=id).all()

    # 实例化Paginator
    paginator = Paginator(song_list, 20)
    # 获取当前页码数据
    res = paginator.page(page)

    return render(request, 'singer/song_list.html', {'info': info, 'songList': res})

模板内容

模板公共头信息

抽离出与歌手基本信息中相同的头部信息,

在singler文件夹中创建common.html文件,

做一个歌手公共头部内容页面。

内容如下:

{% load static %}
<!--导航条开始-->
<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)" class="selected">歌手</a></li>
        <li><a href="javascript:void(0)">单曲</a></li>
        <li><a href="javascript:void(0)">歌单</a></li>
    </ul>
</div>
<!--导航条结束-->

<!--歌手预告开始-->
<div class="singer">
    <div class="singer_bg"></div>
    <div class="singer_info flex_c">
        <div class="singer_cover">
            <img src="/media/{{info.portrait}}" alt="">
        </div>
        <div class="info">
            <p class="flex_c"><span class="name">{{info.name}}</span></p>
            <div class="info_items">
                <span>单曲:<span class="num">{{info.singe_num}}</span></span>
                <span>专辑:<span class="num">{{info.album_num}}</span></span>
                <span>粉丝:<span class="num">100W</span></span>
            </div>
            <div class="singer_items flex_c">
                <p>
                    <span>生日:<span>{{info.birthday}}</span></span>
                    <span>身高:<span>{{info.height}}cm</span></span>
                    <span>体重:<span>{{info.weight}}kg</span></span>
                    <span>星座:<span>{{info.constellation}}...</span></span>
                </p>
                <span class="all"><a href="{% url 'player:singer_detail' info.id %}">全部</a> > </span>
            </div>
            <div class="btns">
                <button class="play"><i class="glyphicon glyphicon-play"></i>&nbsp;&nbsp;播放全部歌曲</button>
                <button><i class="glyphicon glyphicon-heart"></i>&nbsp;&nbsp;收藏</button>
            </div>
        </div>
    </div>
</div>
<!--歌手预告结束-->
单曲列表页面内容

单曲列表页面把原来的模板内容公共部分去掉,通过include引入进来。

接着就是for循环把单曲列表渲染出来;然后做一个分页列表,最后判断无数据显示

固定页面。

注意:需要把歌手基本信息页面也改为引入公共信息处理。

内容如下:

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

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

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

<!--歌手头部公共信息-->
{% include 'singer/common.html' %}

<!--歌手资料开始-->
<div class="main_con">
    <div class="con_l">
        <ul class="tabs flex_c">
            <li>
                <span class="active">单曲</span>
                <span class=""><a href="javascript:void(0)">专辑</a></span>
                <span class=""><a href="{% url 'player:singer_detail' 1 %}">简介</a></span>
            </li>
        </ul>
        <div class="child_view">
            <div class="list_head head_name_singer">
                <ul class="flex_c">
                    <li class="head_num">序号</li>
                    <li class="head_name">歌曲</li>
                    <li class="head_album">歌手</li>
                    <li class="head_time">时长</li>
                </ul>
            </div>
            <ul class="singer_list">
                {% for song in songList %}
                {% if forloop.counter == 1%}
                    <li class="song_item current flex_c">
                {% else %}
                    <li class="song_item flex_c">
                {% endif %}
                        <div class="song_rank flex_c">
                            <div class="rank_num">
                                <span>{{forloop.counter}}</span>
                            </div>
                            <img alt="" class="cover"
                                 data-src="{% static 'images/re_3.jpg' %}"
                                 src="{% static 'images/re_3.jpg' %}" lazy="loaded">
                        </div>
                        <div class="song_name flex_c">
                            <a title="{{song.name}}" href="/play_detail/288010178" class="name">{{song.name}}</a>
                        </div>
                        <div class="song_album">
                            <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>

            {% 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 > 1 %}
            <div class="page">
                <i class="li-page glyphicon glyphicon-menu-left notPointer"></i>
                <ul>
                    {% for index in songList.paginator.page_range %}
                        {% if songList.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>
<!--歌手资料结束-->
{% endblock content %}

计算歌曲时长

表模型增加方法

单曲列表需要显示歌曲时长,但是数据库存储的是秒数,需要转化为分:秒格式。

而查询出来的查询集是一个对象格式的直接添加属性,下一步还是取不到。

解决方法:需要在表模型类中新增一个方法,去处理转换时长格式。

具体如下:

def get_song_duration(self):
    """ 计算歌曲时长 格式 00:00 """

    secs = self.duration % 60
    if secs:
        mins = (self.duration - secs) / 60
    else:
        mins = self.duration - secs / 60
    return str(int(mins)) + ':' + str(secs)

 

模板中使用表模型方法

直接通过循环出的对象调用模型方法,需要注意不带小括号。

内容如下:

{% for song in songList %}
      {{song.get_song_duration}}
{% endfor %}

总结

基本信息这块没什么难度,使用主键直接查询返回给模板渲染即可;

单曲列表分页还是使用Paginator来做,就时长有点小纠结,

没用过别的python框架,还是感觉数据操作这块很麻烦。文章来源地址https://www.toymoban.com/news/detail-688065.html

到了这里,关于Django实现音乐网站 ⒂的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Django实现音乐网站 ⑼

    使用Python Django框架制作一个音乐网站, 本篇主要是后台对专辑、首页轮播图原有功能的基础上进行部分功能实现和显示优化。 目录 专辑功能优化 新增编辑 专辑语种改为下拉选项 添加单曲优化显示 新增单曲多选 更新歌手专辑数、专辑单曲数 获取歌手专辑数 保存处理专辑

    2024年02月13日
    浏览(39)
  • Django实现音乐网站 ⑶

    使用Python Django框架制作一个音乐网站,在系列文章2的基础上继续开发, 本篇主要是后台单曲、专辑、首页轮播图表模块开发。 目录 后台单曲、专辑表模块开发 表结构设计 单曲表(singe)结构 专辑表(album)结构 创建表模型 创建表 后台注册表模型 后台首页轮播图表模块开

    2024年02月14日
    浏览(38)
  • Django实现音乐网站 ⒆

    使用Python Django框架做一个音乐网站, 本篇主要为排行榜功能及音乐播放器部分功能实现。 目录 推荐排行榜优化 设置歌手、单曲跳转链接 排行榜列表渲染优化 视图修改如下: 模板修改如下: 单曲详情修改 排行榜列表 设置路由 视图处理 模板渲染 设置跳转入口 播放器功能

    2024年02月07日
    浏览(35)
  • Django实现音乐网站 ⑴

    使用Python Django框架制作一个音乐网站。 目录 网站功能模块 安装django 创建项目 创建应用 注册应用 配置数据库 设置数据库配置 设置pymysql库引用 创建数据库 创建数据表 生成表迁移文件 执行表迁移 后台管理 创建管理员账户 启动服务器 登录网站 配置时区 配置语言  总结

    2024年02月15日
    浏览(40)
  • Django实现音乐网站 ⑻

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

    2024年02月13日
    浏览(31)
  • Django实现音乐网站 ⒀

    使用Python Django框架制作一个音乐网站, 本篇主要是推荐页-推荐排行榜、推荐歌手功能开发。 目录 推荐页开发 推荐排行榜 单曲表增加播放量 表模型增加播放量字段 执行表操作 模板中显示外键对应值 表模型外键设置 获取外键对应模型值 推荐排行榜视图 推荐排行榜模板 推

    2024年02月11日
    浏览(40)
  • Django实现音乐网站 (21)

    使用Python Django框架做一个音乐网站, 本篇音乐播放器功能完善及原有功能修改。 目录 播放列表修改 视图修改 删除、清空播放器 设置路由 视图处理 修改加载播放器脚本 模板修改 脚本设置 清空功能实现 删除列表音乐 播放列表无数据处理 视图修改 播放音乐与列表同步 修

    2024年02月07日
    浏览(43)
  • Django实现音乐网站 ⑸

    使用Python Django框架制作一个音乐网站, 本篇主要是配置媒体资源设置。 目录 配置介绍 设置媒体资源 创建媒体资源目录 修改settings.py 注册媒体资源路由 总结 静态资源是指项目配置的js/css/image等系统常用文件。对于一些经常变动的资源,通常放在媒体资源文件夹,比如歌手

    2024年02月14日
    浏览(41)
  • Django实现音乐网站 ⑾

    使用Python Django框架制作一个音乐网站, 本篇主要是前端开发前的一些必要配置和首页展示开发。   目录 配置应用路由 创建应用路由文件 应用路径加入项目路径 创建项目模板 创建项目及应用模板路径 设置模板路径 设置静态资源路径 创建静态资源路径 配置静态资源路径

    2024年02月12日
    浏览(39)
  • Django实现音乐网站 ⒁

    使用Python Django框架制作一个音乐网站, 本篇主要是歌手页-全部歌手页功能开发。 目录 分出首页样式内容 创建首页样式文件 首页引入样式文件 全部歌手列表 创建路由 显示视图 引入分页实现库 视图方法 创建歌手首页 增加歌手跳转 导航条改活 首页增加导航条 歌手页增加

    2024年02月10日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包