• Django实现音乐网站 ⒄


    使用Python Django框架制作一个音乐网站,本篇主要是单曲详情页及对

    之前开发歌曲详情无数据及分页不存在情况处理。

    目录

    单曲详情

    设置路由

    视图处理

    引入库文件

    读取歌词方法

    单曲详情视图

    模板渲染

    无数据处理

    歌手详情-基本信息

    视图查询修改

    模板判断无数据

    歌手头部公共信息

    歌手基本信息模板

    歌手详情-单曲列表

    视图查询修改

    模板判断无数据

    歌手详情-专辑列表

    视图查询修改

    模板判断无数据

    总结


    单曲详情

    单曲详情算是一个公共的页面,歌单、排行榜、专辑等都可跳转详情页,

    显示相应单曲信息和歌词列表。

    设置路由

    这次不在设置参数,采用一种新的方式传参。

    path('album/song', views.album_song, name='album_song'),

    视图处理

    引入库文件

    接下来需要读取文件和django设置的媒体目录配置,所以要引用下面的类库。

    1. import os
    2. from django.conf import settings

    读取歌词方法

    通过文件函数读取os连接起来的django设置媒体目录和歌词文件的全路径。

    因为查询返回的歌词文件路径是文件格式需要转化为字符串格式。

    通过循环文件句柄,将读取的每一行放入列表中。

    1. def read_lyric(path):
    2. """ 读取歌词文件 """
    3. f = open(os.path.join(settings.MEDIA_ROOT, str(path)), 'r', encoding='utf-8')
    4. lines = []
    5. for line in f:
    6. lines.append(line)
    7. f.close()
    8. return lines

    单曲详情视图

    这里的参数改为使用request GET 方式读取相应名称参数。

    下面通过filter过滤条件,之后first取一条符合条件数据。

    歌词字段通过读取歌词方法返回内容判断并赋值;

    最后通过locals函数把设置好的变量全都传递给模板。

    1. def album_song(request):
    2. """ 专辑中单曲详情 """
    3. id = request.GET.get('id')
    4. sid = request.GET.get('sid')
    5. info = Album.objects.filter(id=id).first()
    6. song_info = Singe.objects.filter(id=sid).first()
    7. # 歌词处理
    8. lyrics = []
    9. if song_info:
    10. lyrics = read_lyric(song_info.lyric)
    11. return render(request, 'album/song.html', locals())

    模板渲染

    模板中主要渲染两部分内容:单曲信息+歌词列表及所属专辑信息。

    1. {% extends 'common/base.html' %}
    2. {% load static %}
    3. {% block title %}我的音乐-单曲{% endblock title %}
    4. {% block content %}
    5. "stylesheet" href="{% static 'css/album.css' %}">
    6. class="header">
    7. "{% static 'images/logo.png' %}" class="logo" alt="">
      • "{% url 'player:index' %}">推荐
    8. "javascript:void(0)">排行榜
  • "javascript:void(0)" class="selected">歌手
  • "javascript:void(0)">歌单
  • class="main_con">
  • class="content">
  • class="info_l">
  • class="cover_out">
  • "/media/{{info.cover}}" alt="" class="cover" data-src="info.cover" lazy="loaded">
  • "{% static 'images/album_cover_record.png' %}" alt="" class="record">
  • class="intr">专辑简介

  • class="intr_txt">

  • {{info.desc}}...
  • class="info_r">
  • class="song_name flex_c">{{info.name}}

  • class="artist_name flex_c">{{song_info.singler.name}}

  • class="song_info">

  • 专辑:class="tip">{{info.name}}
  • 发行时间:{{song_info.addtime|date:'Y-m-d'}}
  • class="btns">
  • class="glyphicon glyphicon-play"> 立即播放
  • class="glyphicon glyphicon-heart"> 收藏
  • class="lyric lyricAll">
  • {% for line in lyrics %}
  • {% if forloop.counter == 1 %}
  • class="active">{{line}}

  • {% else %}
  • {{line}}

  • {% endif %}
  • {% empty %}
  • 暂无歌词

  • {% endfor %}
  • {% endblock content %}
  •  

    无数据处理

    歌手详情-基本信息

    视图查询修改

    原本使用get方式查询,这种方式可以获得一条符合条件的数据,缺点在于如果没有符合条件的数据,则会抛出异常;改为filter查询方式,这种方式会返回符合记录的集合。就算没有符合条件的也不会抛出异常,只会返回空集。还需要判断结果进行赋值。

    内容如下:

    1. def singer_detail(request, id):
    2. """ 歌手详情-基本信息 """
    3. infos = Singler.objects.filter(id=id)
    4. if infos:
    5. info = infos[0]
    6. else:
    7. info = False
    8. return render(request, 'singer/detail.html', {'info': info})

     

    模板判断无数据

    这里需要把视图传递的变量进行渲染,只需要增加判断是否有数据,没数据显示无数据页面即可。

    歌手头部公共信息

    这里也有歌手信息需要判断,只需要处理路由跳转链接,其他不会报错就不处理了。

    内容如下:

    1. class="all">
    2. {% if info %}
    3. {% else %}
    4. {% endif %}
    5. >

     

    歌手基本信息模板

    这里新增两部分内容:

    处理跳转链接,即歌手相关信息的跳转链接;

    二是增加判断显示无数据内容。

    内容如下:

    1. class="main_con">
    2. class="con_l">
      • class="tabs flex_c">
    3. {% if info %}
    4. {% else %}
    5. {% endif %}
    6. class="active">简介
    7. class="child_view">
    8. {% if not info %}
    9. class="nodata flex_c">
    10. class="inner">
    11. "{% static 'images/nodata.png' %}"
    12. alt="" class="nodata_img">
    13. class="tip">

      暂无相关数据

    14. {% else %}
    15. class="tit">基本信息

    16. class="list_info">
    17. class="info_list flex_c">
    18. class="item_l">
    19. 姓名:class="text">{{info.name}}
    20.  
    21. class="item_r">
    22. 英文名:class="text">{{info.english_name}}
    23. class="info_list flex_c">
    24. class="item_l">
    25. 性别:class="text">
    26. {% if info.gender %}
    27. {% else %}
    28. {% endif %}
    29.  
    30. class="item_r">
    31. 国籍:class="text">{{info.country_name}}
    32. class="info_list flex_c">
    33. class="item_l">
    34. 生日:class="text">{{info.birthday}}
    35.  
    36. class="item_r">
    37. 星座:class="text">{{info.constellation}}
    38. class="info_list flex_c">
    39. class="item_l">
    40. 身高:class="text">{{info.height}}cm
    41.  
    42. class="item_r">
    43. 体重:class="text">{{info.weight}}kg
    44. class="tit">个人简介

    45. class="info">{{info.desc|safe}}

    46. {% endif %}

     

    歌手详情-单曲列表

    视图查询修改

    歌手基本信息查询把get查询改为filter过滤器查询。

    分页数据也要处理无分页和分页超过最大分页情况。

    内容如下:

    1. def singer_song(request, id, page):
    2. """ 歌手详情-单曲列表 """
    3. # 歌手基本信息
    4. info = Singler.objects.filter(pk=id).first()
    5. song_list = Singe.objects.filter(singler_id=id).all()
    6. # 实例化Paginator
    7. paginator = Paginator(song_list, 20)
    8. try:
    9. res = paginator.page(page)
    10. except PageNotAnInteger:
    11. res = paginator.page(1)
    12. except EmptyPage:
    13. res = paginator.page(paginator.num_pages)
    14. return render(request, 'singer/song_list.html', {
    15. 'info': info,
    16. 'songList': res,
    17. 'list_num': len(song_list)
    18. })

     

    模板判断无数据

    主要判断跳转链接进行无数据处理。

    内容如下:

      • class="tabs flex_c">
    1. class="active">单曲
    2. {% if info %}
    3. {% else %}
    4. {% endif %}

     

    歌手详情-专辑列表

    视图查询修改

    还是歌手基本信息查询方式修改;分页处理修改;这里使用locals优化传给模板的变量。

    内容如下:

    1. def singer_album(request, id, page):
    2. """ 歌手详情-专辑列表 """
    3. # 歌手基本信息
    4. info = Singler.objects.filter(pk=id).first()
    5. # 专辑列表
    6. albumList = Album.objects.filter(singler_id=id).order_by('-id').all()
    7. # 实例化Paginator
    8. paginator = Paginator(albumList, 20)
    9. try:
    10. res = paginator.page(page)
    11. except PageNotAnInteger:
    12. res = paginator.page(1)
    13. except EmptyPage:
    14. res = paginator.page(paginator.num_pages)
    15. list_num = len(res)
    16. return render(request, 'singer/album_list.html', locals())

    模板判断无数据

    原有的无数据页面不用修改,只需要判断单曲和简介的链接处理。

    内容如下:

      • class="tabs flex_c">
    1. {% if info %}
    2. class="active">专辑
    3. {% else %}
    4. class="active">专辑
    5. {% endif %}

    总结

    数据查询时,查询单条数据最好使用filter过滤器+first,

    如果直接使用get查询,没有符合条件就会抛出异常,

    或者也可以使用try对异常进行处理。

    模板中要增加无数据提醒内容,这样用户体验会好一点。

  • 相关阅读:
    k8s实战案例之基于StatefulSet控制器运行MySQL一主多从
    Apache Kudu的Schema设计(column数据类型)
    JavaSE:异常处理
    IOS 发布遇到“Unable to authenticate with App Store Connect”错误咋解决?
    ONES 团队版50人以下免费,助力中小企业「弯道超车」
    温湿度传感器为什么会有这么多型号,应该如何挑选?
    如何在并行安装中更改默认的SOLIDWORKS版本?| SOLIDWORKS教程
    [MyBatisPlus]标准数据层开发(CRUD、分页)
    IDM下载器安装cmd注册
    离散数学第二章笔记
  • 原文地址:https://blog.csdn.net/json_ligege/article/details/132824114