• "javascript:void(0)" class="selected">歌手
  • "{% url 'player:singer' %}">单曲
  • "javascript:void(0)">歌单
  • class="singer">
  • class="singer_bg">
  • class="singer_info flex_c">
  • class="singer_cover">
  • "/media/{{info.portrait}}" alt="">
  • class="info">
  • class="flex_c">class="name">{{info.name}}

  • class="info_items">
  • 单曲:class="num">{{info.singe_num}}
  • 专辑:class="num">{{info.album_num}}
  • 粉丝:class="num">100W
  • class="singer_items flex_c">
  • 生日:{{info.birthday}}
  • 身高:{{info.height}}cm
  • 体重:{{info.weight}}kg
  • 星座:{{info.constellation}}...
  • class="btns">
  • class="main_con">
  • class="con_l">
    • class="tabs flex_c">
  • class="active">简介
  • class="child_view">
  • class="tit">基本信息

  • class="list_info">
  • class="info_list flex_c">
  • class="item_l">
  • 姓名:class="text">{{info.name}}
  •  
  • class="item_r">
  • 英文名:class="text">-
  • class="info_list flex_c">
  • class="item_l">
  • 性别:class="text">男
  •  
  • class="item_r">
  • 国籍:class="text">中国香港
  • class="info_list flex_c">
  • class="item_l">
  • 生日:class="text">{{info.birthday}}
  •  
  • class="item_r">
  • 星座:class="text">{{info.constellation}}
  • class="info_list flex_c">
  • class="item_l">
  • 身高:class="text">{{info.height}}cm
  •  
  • class="item_r">
  • 体重:class="text">{{info.weight}}kg
  • class="tit">个人简介

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

  • {% endblock content %}
  •  

    推荐歌手跳转详情

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

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

     

    歌手增加基本信息

    表模型增加字段

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

    内容如下:

    1. english_name = models.CharField(
    2. '英文名',
    3. max_length=50,
    4. help_text='请输入歌手英文名',
    5. default='-'
    6. )
    7. gender = models.IntegerField(
    8. '性别',
    9. help_text='请选择歌手性别',
    10. choices=((0, '女'), (1, '男')),
    11. default=1
    12. )
    13. country_name = models.CharField(
    14. '国籍',
    15. max_length=50,
    16. help_text='请输入歌手国籍',
    17. default='-'
    18. )

    数据表更新

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

    1. python manage.py makemigrations
    2. python manage.py migrate

    效果如下:

     

    基本信息增加内容渲染

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

    内容如下:

    1. class="child_view">
    2. class="tit">基本信息

    3. class="list_info">
    4. class="info_list flex_c">
    5. class="item_l">
    6. 姓名:class="text">{{info.name}}
    7.  
    8. class="item_r">
    9. 英文名:class="text">{{info.english_name}}
    10. class="info_list flex_c">
    11. class="item_l">
    12. 性别:class="text">
    13. {% if info.gender %}
    14. {% else %}
    15. {% endif %}
    16.  
    17. class="item_r">
    18. 国籍:class="text">{{info.country_name}}

    歌手单曲列表

    路由设置

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

    path('singer/song//', views.singer_song, name='singer_song'),

    跳转设置

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

    class="">"{% url 'player:singer_song' info.id 1 %}">单曲

    视图方法

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

    1. def singer_song(request, id, page):
    2. """ 歌手详情-单曲列表 """
    3. # 歌手基本信息
    4. info = Singler.objects.get(pk=id)
    5. # 单曲列表
    6. song_list = Singe.objects.filter(singler_id=id).all()
    7. # 实例化Paginator
    8. paginator = Paginator(song_list, 20)
    9. # 获取当前页码数据
    10. res = paginator.page(page)
    11. return render(request, 'singer/song_list.html', {'info': info, 'songList': res})

    模板内容

    模板公共头信息

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

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

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

    内容如下:

    1. {% load static %}
    2. class="header">
    3. "{% static 'images/logo.png' %}" class="logo" alt="">
      • "{% url 'player:index' %}">推荐
      • "javascript:void(0)" class="selected">歌手
      • "javascript:void(0)">单曲
      • "javascript:void(0)">歌单
      • class="singer">
      • class="singer_bg">
      • class="singer_info flex_c">
      • class="singer_cover">
      • "/media/{{info.portrait}}" alt="">
      • class="info">
      • class="flex_c">class="name">{{info.name}}

      • class="info_items">
      • 单曲:class="num">{{info.singe_num}}
      • 专辑:class="num">{{info.album_num}}
      • 粉丝:class="num">100W
      • class="singer_items flex_c">
      • 生日:{{info.birthday}}
      • 身高:{{info.height}}cm
      • 体重:{{info.weight}}kg
      • 星座:{{info.constellation}}...
      • class="btns">

      单曲列表页面内容

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

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

      固定页面。

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

      内容如下:

      1. {% extends 'common/base.html' %}
      2. {% load static %}
      3. {% block title %}我的音乐-歌手{% endblock title %}
      4. {% block content %}
      5. "stylesheet" href="{% static 'css/singer_song.css' %}">
      6. {% include 'singer/common.html' %}
      7. class="main_con">
      8. class="con_l">
        • class="tabs flex_c">
      9. class="active">单曲
      10. class="child_view">
      11. class="list_head head_name_singer">
        • class="flex_c">
      12. class="head_num">序号
      13. class="head_name">歌曲
      14. class="head_album">歌手
      15. class="head_time">时长
        • class="singer_list">
      16. {% for song in songList %}
      17. {% if forloop.counter == 1%}
      18. class="song_item current flex_c">
      19. {% else %}
      20. class="song_item flex_c">
      21. {% endif %}
      22. class="song_rank flex_c">
      23. class="rank_num">
      24. {{forloop.counter}}
      25. <span"" class="cover"
      26. data-src="{% static 'images/re_3.jpg' %}"
      27. src="{% static 'images/re_3.jpg' %}" lazy="loaded">
      28. class="song_name flex_c">
      29. class="song_album">
      30. "{{song.singler.name}}">{{song.singler.name}}
      31. class="song_time">
      32. {{song.get_song_duration}}
      33. class="song_opts flex_c">
      34. class="glyphicon glyphicon-plus">
      35. class="glyphicon glyphicon-play">
      36. class="glyphicon glyphicon-heart">
      37. {% endfor %}
      38. {% if list_num < 1 %}
      39. class="nodata flex_c">
      40. class="inner">
      41. "{% static 'images/nodata.png' %}"
      42. alt="" class="nodata_img">
      43. class="tip">

        暂无相关数据

      44. {% endif %}
      45. {% if list_num > 1 %}
      46. class="page">
      47. class="li-page glyphicon glyphicon-menu-left notPointer">
        • {% for index in songList.paginator.page_range %}
        • {% if songList.number == index %}
        • "#" class="notCursor currentPage">{{index}}
        • {% else %}
        • "{% url 'player:singer' index %}">{{index}}
        • {% endif %}
        • {% endfor %}
        • class="glyphicon glyphicon-menu-right li-page">
        • {% endif %}
        • {% endblock content %}

        计算歌曲时长

        表模型增加方法

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

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

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

        具体如下:

        1. def get_song_duration(self):
        2. """ 计算歌曲时长 格式 00:00 """
        3. secs = self.duration % 60
        4. if secs:
        5. mins = (self.duration - secs) / 60
        6. else:
        7. mins = self.duration - secs / 60
        8. return str(int(mins)) + ':' + str(secs)

         

        模板中使用表模型方法

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

        内容如下:

        1. {% for song in songList %}
        2. {{song.get_song_duration}}
        3. {% endfor %}

        总结

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

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

        没用过别的python框架,还是感觉数据操作这块很麻烦。

      48. 相关阅读:
        【毕业设计】树莓派寻迹小车 车道线检测 - 机器视觉 单片机 嵌入式 物联网
        IntelliJ IDEA 运行 Main 或 Test 时不自动打包
        动画原理总结
        Win11一键重装系统后如何使用自带的故障检测修复功能
        《探索网校 App 的魅力世界:知识与科技的完美结合》
        计算机的分类
        聊聊Java中的自定义异常
        Qt | 键盘事件
        刷算法Leetcode---8(二叉树篇)(层序遍历)
        长尾分布系列论文解析(二)Delving into Deep Imbalanced Regression
      49. 原文地址:https://blog.csdn.net/json_ligege/article/details/132608841