Django实现音乐网站 ⒃

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

本篇主要是歌手详情页-专辑列表、专辑详情-单曲列表开发实现内容。

目录

歌手详情-专辑列表

路由设置

跳转设置

视图方法

模板内容

专辑详情-单曲列表

设置路由

视图处理并返回

模板渲染

分页优化

引入错误类型库

分页实例

总结


歌手详情-专辑列表

通过歌手名称进入歌手详情,再点击专辑可查看歌手拥有专辑列表。

路由设置

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

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

跳转设置

在歌手详情中专辑切换设置跳转链接。

专辑

视图方法

查询歌手信息,通过歌手外键id查询歌手所拥有的专辑列表,之后进行分页。

def singer_album(request, id, page):
    """ 歌手详情-专辑列表 """

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

    # 专辑列表
    album_list = Album.objects.filter(singler_id=id).all()

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

    return render(request, 'singer/album_list.html', {
        'info': info,
        'albumList': res,
        'list_num': len(album_list)
    })

模板内容

通过两个for循环渲染专辑列表和分页列表,if判断后显示无数据内容。

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

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

{% block content %}



{% include 'singer/common.html' %}


{% for album in albumList %}

{{album.name}}

{{album.addtime}}

{% endfor %}
{% if list_num < 1 %}

暂无相关数据

{% endif %} {% if list_num > 1 %}
    {% for index in albumList.paginator.page_range %} {% if albumList.number == index %}
  • {{index}}
  • {% else %}
  • {{index}}
  • {% endif %} {% endfor %}
{% endif %}
{% endblock content %}

专辑详情-单曲列表

通过歌手详情-专辑列表跳转到专辑详情-单曲列表。

设置路由

专辑详情没有分页,只需要设置专辑id参数即可。

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

视图处理并返回

这里就有些复杂,虽然代码比较少,还是有些技术含量的。

专辑表和单曲表是多对多的关系,查询时需要prefetch_related进行关联对应表模型。

def album(request, id):
    """ 专辑详情-单曲列表 """

    # 查询专辑信息
    # 通过 prefetch_related 关联对应表模型 进行多对多的关联查询
    info = Album.objects.prefetch_related('Singe').filter(id=id).first()
    # 专辑单曲列表
    song_list = info.Singe.all()

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

模板渲染

模板渲染与歌手-单曲列表模板处理差不多,只需要注意歌手名称的显示和单曲时长显示。

内容如下:

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

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

{% block content %}







专辑简介

{{info.desc}}...

{{info.name}}

{{info.single.name}}

语种:{{info.single_lang}} 发行时间:{{info.addtime}}

  • 序号
  • 歌曲
  • 歌手
  • 时长
    {% for song in songList %}
  • {{forloop.counter}}
    {{song.singler.name}}
    {{song.get_song_duration}}
  • {% endfor %}
{% if info == False %}

暂无相关数据

{% endif %}
{% endblock content %}

分页优化

分页原来的处理比较简单,只是实现分页功能,没有处理分页范围。

这次在原来的基础上,对超出总页数和页数为空情况进行处理。

引入错误类型库

from django.core.paginator import EmptyPage, PageNotAnInteger

分页实例

在try...except判断中处理分页判断并进行处理;

通过使用locals函数对传递模板的参数进行优化,不需要再单独赋值。

内容如下:

def singer_album(request, id, page):
    """ 歌手详情-专辑列表 """

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

    # 专辑列表
    albumList = Album.objects.filter(singler_id=id).order_by('-id').all()

    # 实例化Paginator
    paginator = Paginator(albumList, 20)

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

    return render(request, 'singer/album_list.html', locals())

总结

本篇主要实现歌手详情中的专辑列表和专辑详情中单曲列表,

综合使用了分页、外键查询、连表查询、模板中的循环、判断标签及对分页进行优化。

你可能感兴趣的:(#,Django项目,django,python,后端)