• Django实现音乐网站 ⒁


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

    本篇主要是歌手页-全部歌手页功能开发。

    目录

    分出首页样式内容

    创建首页样式文件

    首页引入样式文件

    全部歌手列表

    创建路由

    显示视图

    引入分页实现库

    视图方法

    创建歌手首页

    增加歌手跳转

    导航条改活

    首页增加导航条

    歌手页增加导航条

    歌手首字母搜索

    路由增加参数

    视图字母搜索

    模板字母搜索

    筛选无数据处理

    修改歌手跳转链接

    总结


    分出首页样式内容

    创建首页样式文件

    把首页样式内容从基础样式文件中移动出来,独立创建index.css文件。

    首页引入样式文件

    在idnex.html引入index.css文件,防止首页样式设置影响其他页面样式。

    内容如下:

    1. {% extends 'common/base.html' %}
    2. {% load static %}
    3. {% block title %}我的音乐{% endblock title %}
    4. {% block content %}
    5. "stylesheet" href="{% static 'css/index.css' %}">
    6. "stylesheet" href="{% static 'css/swiper-bundle.min.css' %}">

    全部歌手列表

    创建路由

    在player/urls.py中在原有路由下增加新路由,并设置分页参数page。

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

    显示视图

    在player/views.py中创建歌手模块首页视图方法。

    引入分页实现库
    from django.core.paginator import Paginator

    视图方法

    处理字母列表这个很简单。关键在于全部歌手列表,先获取歌手列表数据,然后通过分页组件处理成分页数据,最后返回给模板。

    内容如下:

    1. def singer(request, page):
    2. """ 歌手列表 """
    3. # 字母列表
    4. letters = [chr(i) for i in range(ord('A'), ord('Z') + 1)]
    5. # 所有歌手列表
    6. singlerList = Singler.objects.all().order_by('-singe_num')
    7. # 实例化Paginator 每页显示24条
    8. paginator = Paginator(singlerList, 24)
    9. # 获取当前页码数据
    10. res = paginator.page(page)
    11. return render(request, 'singer/index.html', {
    12. 'letters': letters,
    13. 'singlerList': res
    14. })

    创建歌手首页

    在templates中创建singer文件夹,并在文件夹中创建index.html文件。

    内容如下:

    1. {% extends 'common/base.html' %}
    2. {% load static %}
    3. {% block title %}我的音乐-歌手{% endblock title %}
    4. {% block content %}
    5. "stylesheet" href="{% static 'css/singer.css' %}">
    6. class="nav_list">
      • class="nav_1">
    7. class="active">"#" class="first">热门
  • {% for lname in letters %}
  • "{% url 'player:singer' 1 lname %}">{{lname}}
  • {% endfor %}
  • "{% url 'player:singer' 1 '#' %}">#
  • class="singer_list">
  • class="list_max">
  • {% for item in singlerList %}
  • {% if forloop.counter < 6 %}
  • class="item">
  • class="cover">
  • "/media/{{item.portrait}}" alt="">
  • class="num">{{item.singe_num}}首歌曲

  • {% elif forloop.counter == 7 %}
  • class="list_min">
  • class="item">
  • class="cover">
  • "/media/{{item.portrait}}" alt="">
  • {% else %}
  • class="item">
  • class="cover">
  • "/media/{{item.portrait}}" alt="">
  • {% endif %}
  • {% endfor %}
  • {% if list_num < 1 %}
  • class="nodata flex_c">
  • class="inner">
  • "{% static 'images/nodata.png' %}"
  • alt="" class="nodata_img">
  • class="tip">

    暂无相关数据

  • {% endif %}
  • {% if list_num > 1 %}
  • class="page">
  • class="li-page glyphicon glyphicon-menu-left notPointer">
    • {% for index in singlerList.paginator.page_range %}
    • {% if singlerList.number == index %}
    • "#" class="notCursor currentPage">{{index}}
    • {% else %}
    • "{% url 'player:singer' index %}">{{index}}
    • {% endif %}
    • {% endfor %}
    • class="glyphicon glyphicon-menu-right li-page">
    • {% endif %}
    • {% endblock content %}
    • 增加歌手跳转

      修改header.html文件中歌手跳转超链接。

      内容如下:

      <li><a href="javascript:void(0)" class="selected">歌手a>li>

      导航条改活

      想了想还是把导航条改为每个页面,而不是作为公共部分。

      首页增加导航条

      基础模板中去掉导航头,并把导航条内容移动到首页原内容之上。

      内容如下:

      1. {% extends 'common/base.html' %}
      2. {% load static %}
      3. {% block title %}我的音乐{% endblock title %}
      4. {% block content %}
      5. <link rel="stylesheet" href="{% static 'css/index.css' %}">
      6. <link rel="stylesheet" href="{% static 'css/swiper-bundle.min.css' %}">
      7. <div class="header">
      8. <img src="{% static 'images/logo.png' %}" class="logo" alt="">
      9. <ul>
      10. <li><a href="javascript:void(0)" class="selected">推荐a>li>
      11. <li><a href="javascript:void(0)">排行榜a>li>
      12. <li><a href="{% url 'player:singer' 1 %}">歌手a>li>
      13. <li><a href="javascript:void(0)">单曲a>li>
      14. <li><a href="javascript:void(0)">歌单a>li>
      15. ul>
      16. div>

      歌手页增加导航条

      在分类筛选列表模块之上增加导航条。

      内容如下:

      1. <div class="header">
      2. <img src="{% static 'images/logo.png' %}" class="logo" alt="">
      3. <ul>
      4. <li><a href="{% url 'player:index' %}">推荐a>li>
      5. <li><a href="javascript:void(0)">排行榜a>li>
      6. <li><a href="javascript:void(0)" class="selected">歌手a>li>
      7. <li><a href="javascript:void(0)">单曲a>li>
      8. <li><a href="javascript:void(0)">歌单a>li>
      9. ul>
      10. div>

      歌手首字母搜索

      全部歌手列表增加首字母筛选条件,下面就开始实现。

      路由增加参数

      在原有分页参数后增加字母搜索参数。

      path('singer/detail//', views.singer_detail, name='singer_detail'),

      视图字母搜索

      增加name参数接收字母值,如果是#则获取所有歌手列表,其他字母查询相应歌手列表。

      1. def singer(request, page, name):
      2. """ 歌手列表 """
      3. # 字母列表
      4. letters = [chr(i) for i in range(ord('A'), ord('Z') + 1)]
      5. # 是否搜索首字母
      6. if name != '#':
      7. # 符合首字母的歌手列表
      8. singlerList = Singler.objects.filter(first_letter=name).order_by('-singe_num')
      9. else:
      10. # 所有歌手列表
      11. singlerList = Singler.objects.all().order_by('-singe_num')
      12. # 实例化Paginator 每页显示24条
      13. paginator = Paginator(singlerList, 24)
      14. # 获取当前页码数据
      15. res = paginator.page(page)
      16. return render(request, 'singer/index.html', {
      17. 'letters': letters,
      18. 'singlerList': res,
      19. 'list_num': len(singlerList)
      20. })

      模板字母搜索

      全部歌手页链接增加字母筛选条件。

      1. class="nav_list">
        • class="nav_1">
      2. class="active">"#" class="first">热门
      3. {% for lname in letters %}
      4. "{% url 'player:singer' 1 lname %}">{{lname}}
      5. {% endfor %}
      6. "{% url 'player:singer' 1 '#' %}">#

      筛选无数据处理

      在首页条件筛选无数据的情况处理,出现无数据提示,隐藏分页列表。

      1. {% if list_num < 1 %}
      2. class="nodata flex_c">
      3. class="inner">
      4. "{% static 'images/nodata.png' %}"
      5. alt="" class="nodata_img">
      6. class="tip">

        暂无相关数据

      7. {% endif %}
      8. {% if list_num > 1 %}
      9. class="page">
      10. class="li-page glyphicon glyphicon-menu-left notPointer">
        • {% for index in singlerList.paginator.page_range %}
        • {% if singlerList.number == index %}
        • "#" class="notCursor currentPage">{{index}}
        • {% else %}
        • "{% url 'player:singer' index %}">{{index}}
        • {% endif %}
        • {% endfor %}
        • class="glyphicon glyphicon-menu-right li-page">
        • {% endif %}

        修改歌手跳转链接

        原有跳转歌手的链接需要添加参数,已经无法使用。

      11. "{% url 'player:singer' 1 '#' %}">歌手
      12. 总结

        又来更新django音乐网站项目了, 最近一直比较忙,零零碎碎往前推进一点。

        本篇主要是歌手页-全部歌手展示页面的开发,其中关键点在于分页和条件筛选的实现。

      13. 相关阅读:
        使用 Meltano 将数据从 Snowflake 导入到 Elasticsearch:开发者之旅
        事务,不只ACID
        Python—3.2、函数高级篇
        mysql学习--binlog与gtid主从同步
        k8s探针详解
        【操作系统】[linux]基本指令-快速上手
        字节携港大南大升级 LLaVA-NeXT:借 LLaMA-3 和 Qwen-1.5 脱胎换骨,轻松追平 GPT-4V
        使用 Prometheus 和 Grafana 监控 FastAPI 服务
        Redis6 六:Redis常用五大数据类型—— 集合Set 、 哈希hash 和 有序集合Zset
        Server-Sent Events 一种轻量级的Push方式
      14. 原文地址:https://blog.csdn.net/json_ligege/article/details/132587373