Django实现音乐网站 ⒅

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

本篇主要为歌单列表、歌单详情及推荐页-歌单内容改动。

目录

歌单列表

设置路由

视图处理

模板渲染

歌单-单曲列表

设置路由

视图处理

模板渲染

推荐页-歌单列表

模板渲染修改

总结


歌单列表

可通过导航>歌单或者推荐歌单中分类跳转到歌单列表。

设置路由

path('songsheet', views.songsheet, name='songsheet'),

视图处理

设置接收三个参数:

分页,设置默认为1;

分类id,设置默认为精选歌单;

排序规则,最新1,最热2;

def songsheet(request):
    """ 歌单列表 """

    page = request.GET.get('page', 1)
    cid = request.GET.get('cid', 1)
    # 排序 1最新 2最热
    sort = request.GET.get('sort', 1)
    if sort == 1:
        songsheets = SongSheet.objects.filter(category=cid).order_by('-addtime').all()
    else:
        songsheets = SongSheet.objects.filter(category=cid).order_by('playnum').all()
    # 实例化Paginator
    paginator = Paginator(songsheets, 20)

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

    list_num = len(res)

    cid = int(cid)
    # 歌单类型列表
    cates = SongCategory.categoryChoice
    cate_all = SongCategory.objects.order_by('id').all()
    return render(request, 'songsheet/index.html', locals())

说明:

对cid进行数值处理,是为了模板中if判断选中使用。

歌单类型列表在模板中的渲染分为了两部分:

1.父级类型2.所属子集类型;本来想在视图中处理为一个列表,发现模板中无法渲染,

最后只能全部传给模板,在父循环中再套一个循环判断是否为相应子集进行渲染操作。

模板渲染

内容如下:

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

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

{% block content %}







推荐歌单
{% if sort == '1' %} 最新 最热 {% else %} 最新 最热 {% endif %}
{% for son in res %}

{{ son.name }}

{{ son.playnum }}

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

暂无相关数据

{% endif %} {% if list_num > 0 %}
    {% for index in res.paginator.page_range %} {% if res.number == index %}
  • {{index}}
  • {% else %}
  • {{index}}
  • {% endif %} {% endfor %}
{% endif %}
{% endblock content %} {% block styleJs %} {# 子页面引入js文件 #} {% endblock styleJs %}

说明:

最新、最热排序增加判断,选中效果并传递相应参数给视图,进行排序显示。

然后就是歌单类型渲染了,怎么渲染的及思路在视图处理时已做了说明,需要着重说的是,

这块费时不少:1.父子集合渲染;2.筛选条件判断选中;3.点击隐藏显示效果,需要点击相应元素打开列表,之后可以点打开元素关闭,也可以点空白处关闭。这部分功能,尝试了好几种方法,都不太理想,最后绑定body点击事件,给所点击元素做了个白名单,白名单内部的就打开歌单列表,否则就关闭。

效果:

Django实现音乐网站 ⒅_第1张图片

 

歌单-单曲列表

也就是点击某个歌单后,跳转到歌单详情,展示歌单信息和所属歌单的单曲列表,有分页。

设置路由

path('songsheet/song', views.songsheet_song, name='songsheet_song'),

视图处理

视图处理较为简单,查询歌单信息,通过歌单与单曲外键获取相应的单曲列表;

进行分页处理,最后返回模板。

内容如下:

def songsheet_song(request):
    """ 歌单详情-单曲列表 """

    id = request.GET.get('id', 1)
    page = request.GET.get('page', 1)

    # 查询歌单信息
    info = SongSheet.objects.filter(id=id).first()
    # 歌单单曲列表
    song_list = info.singe.all()
    # 歌单类型
    categorys = info.category.values('name')
    # 实例化Paginator
    paginator = Paginator(song_list, 20)

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

    list_num = len(res)
    return render(request, 'songsheet/song.html', locals())

 

模板渲染

模板就更简单了,直接使用的专辑详情的页面模板,改一改部分内容显示,增加一个分页。

内容如下:

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

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

{% block content %}







歌单简介

{{info.desc}}...

{{info.name}}

{{info.single.name}}

{% for c in categorys %} {{c.name}} {% endfor %}

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

暂无相关数据

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

 

推荐页-歌单列表

因为歌单功能已做完,现在可以把推荐页面的推荐歌单列表跳转改活。

增加:更多跳转到所有歌单列表;分类跳转总歌单列表相应分类;

歌单列表点击封面和歌单名称跳转到相应详情。

模板渲染修改

templates/index/index.html中推荐歌单块内容修改。

内容如下:

{% for son in songsheets %}

{{ son.name }}

{{ son.playnum }}

{% endfor %}

总结

做完歌单列表,再做歌单详情有种水到渠成的快速。

关联的搜索查询,复杂的数据处理及复杂数据在模板中的渲染和选中判断,有些难度。

其他的都是一些简单的内容。

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