Django实现音乐网站 ⒀

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

本篇主要是推荐页-推荐排行榜、推荐歌手功能开发。

目录

推荐页开发

推荐排行榜

单曲表增加播放量

表模型增加播放量字段

执行表操作

模板中显示外键对应值

表模型外键设置

获取外键对应模型值

推荐排行榜视图

推荐排行榜模板

推荐歌手

推荐歌手视图

推荐歌手模板

总结


推荐页开发

推荐排行榜

排行榜这个功能后期在做吧,比较麻烦,目前先做一个模拟的排行榜数据返回。

单曲表增加播放量

做歌曲排行榜才发现歌曲表没有播放量字段。

表模型增加播放量字段

在player/models.py单曲表中增加播放量字段。

内容如下:

python 复制代码
playnum = models.IntegerField(default=0, editable=False)
执行表操作
bash 复制代码
python manage.py makemigrations
python manage.py migrate

执行过程

模板中显示外键对应值

在模板中显示外键对应值很关键,在python中有特殊的方法,开始时我还是按照以前的方式去显示,即先获取A表模型中所有名称组成一个一维的列表,然后获取B表模型数据,在一个循环中使用B模型与A模型对应外键,取相应值并赋值,最终组成一个新的二维对象类型数据返回给模版,结果模版解析不了二维对象。

之后直接返回A模型所有名称的一维列表,在模板的for循环中使用B表模型中对应A模型外键直接解析,还是不行!

最终在网上找了好多文章,才从其中一个找到端倪;其实这个问题一点也不复杂,因为Django中已经给做好了,不用再做关键模型赋值操作,其他文章没写是因为一旦会了就不觉得是问题,但是不会真的百思不得其解,在这里记录一下吧。

表模型外键设置
python 复制代码
# 设置与歌手表关联外键 一对多外键设置在多的模型中
singler = models.ForeignKey(
    "Singler",
    on_delete=models.CASCADE,
    verbose_name='歌手',
    help_text='请选择歌手'
)
获取外键对应模型值
python 复制代码
{% for hot in hot_ranks %}
      {{ hot.singler.name }}
{% endfor %}

推荐排行榜视图

在原来的推荐歌单数据查询下增加推荐排行榜查询处理。

python 复制代码
def index(request):
    """ 显示首页 """

    ......

    # 推荐排行榜
    # 热歌榜 取播放量最多的五个
    hot_ranks = Singe.objects.order_by('-playnum').all()[0:5]
    # 新歌榜 取最新的五个
    new_ranks = Singe.objects.order_by('-id').all()[0:5]
    # 飙升榜
    biao_ranks = Singe.objects.order_by('id').all()[0:5]
    # 欧美榜
    ea_ranks = Singe.objects.order_by('-id').all()[0:5]
    # 日韩榜
    js_ranks = Singe.objects.order_by('id').all()[0:5]

    return render(request, 'index/index.html', {
        'carousels': carousel_imgs,
        'songsheets': songsheets,
        'hot_ranks': hot_ranks,
        'new_ranks': new_ranks,
        'biao_ranks': biao_ranks,
        'ea_ranks': ea_ranks,
        'js_ranks': js_ranks
    })

推荐排行榜模板

html 复制代码
<!--推荐排行榜开始-->
<div class="recommend_rank">
    <div class="title">
        <div class="name">推荐排行榜</div>
        <ul>
            <li><a href="#">更多></a></li>
        </ul>
    </div>
    <div class="list">
        <div class="bank">
            <div class="bank_top">
                <div class="img">
                    <img class="img_tip" src="{% static 'images/b1.png' %}" alt="">
                </div>
                <img class="img_bg" src="{% static 'images/b1_1.jpg' %}" alt="">
            </div>
            <ul class="bank_list">
                {% for hot in hot_ranks %}
                    <li>
                        {% if forloop.counter == 1 %}
                            <div class="top_img top1"></div>
                        {% elif forloop.counter == 2 %}
                            <div class="top_img top2"></div>
                        {% elif forloop.counter == 3 %}
                            <div class="top_img top3"></div>
                        {% else %}
                            <div class="top_index">{{forloop.counter}}</div>
                        {% endif %}
                        <div class="top_info">
                            <p class="song_name">{{ hot.name }}</p>
                            <p class="singler">{{ hot.singler.name }}</p>
                        </div>
                    </li>
                {% endfor %}
            </ul>
        </div>
        <div class="bank">
            <div class="bank_top">
                <div class="img">
                    <img class="img_tip" src="{% static 'images/b2.png' %}" alt="">
                </div>
                <img class="img_bg" src="{% static 'images/b2_2.jpg' %}" alt="">
            </div>
            <ul class="bank_list">
                {% for news in new_ranks %}
                    <li>
                        {% if forloop.counter == 1 %}
                            <div class="top_img top1"></div>
                        {% elif forloop.counter == 2 %}
                            <div class="top_img top2"></div>
                        {% elif forloop.counter == 3 %}
                            <div class="top_img top3"></div>
                        {% else %}
                            <div class="top_index">{{forloop.counter}}</div>
                        {% endif %}
                        <div class="top_info">
                            <p class="song_name">{{ news.name }}</p>
                            <p class="singler">{{ news.singler.name }}</p>
                        </div>
                    </li>
                {% endfor %}
            </ul>
        </div>
        <div class="bank">
            <div class="bank_top">
                <div class="img">
                    <img class="img_tip" src="{% static 'images/b3.png' %}" alt="">
                </div>
                <img class="img_bg" src="{% static 'images/b3_3.jpg' %}" alt="">
            </div>
            <ul class="bank_list">
                {% for biao in biao_ranks %}
                    <li>
                        {% if forloop.counter == 1 %}
                            <div class="top_img top1"></div>
                        {% elif forloop.counter == 2 %}
                            <div class="top_img top2"></div>
                        {% elif forloop.counter == 3 %}
                            <div class="top_img top3"></div>
                        {% else %}
                            <div class="top_index">{{forloop.counter}}</div>
                        {% endif %}
                        <div class="top_info">
                            <p class="song_name">{{ biao.name }}</p>
                            <p class="singler">{{ biao.singler.name }}</p>
                        </div>
                    </li>
                {% endfor %}
            </ul>
        </div>
        <div class="bank">
            <div class="bank_top">
                <div class="img">
                    <img class="img_tip" src="{% static 'images/b4.png' %}" alt="">
                </div>
                <img class="img_bg" src="{% static 'images/b4_4.jpg' %}" alt="">
            </div>
            <ul class="bank_list">
                {% for ea in ea_ranks %}
                    <li>
                        {% if forloop.counter == 1 %}
                            <div class="top_img top1"></div>
                        {% elif forloop.counter == 2 %}
                            <div class="top_img top2"></div>
                        {% elif forloop.counter == 3 %}
                            <div class="top_img top3"></div>
                        {% else %}
                            <div class="top_index">{{forloop.counter}}</div>
                        {% endif %}
                        <div class="top_info">
                            <p class="song_name">{{ ea.name }}</p>
                            <p class="singler">{{ ea.singler.name }}</p>
                        </div>
                    </li>
                {% endfor %}
            </ul>
        </div>
        <div class="bank">
            <div class="bank_top">
                <div class="img">
                    <img class="img_tip" src="{% static 'images/b5.png' %}" alt="">
                </div>
                <img class="img_bg" src="{% static 'images/b5_5.jpg' %}" alt="">
            </div>
            <ul class="bank_list">
                {% for jss in js_ranks %}
                    <li>
                        {% if forloop.counter == 1 %}
                            <div class="top_img top1"></div>
                        {% elif forloop.counter == 2 %}
                            <div class="top_img top2"></div>
                        {% elif forloop.counter == 3 %}
                            <div class="top_img top3"></div>
                        {% else %}
                            <div class="top_index">{{forloop.counter}}</div>
                        {% endif %}
                        <div class="top_info">
                            <p class="song_name">{{ jss.name }}</p>
                            <p class="singler">{{ jss.singler.name }}</p>
                        </div>
                    </li>
                {% endfor %}
            </ul>
        </div>
    </div>
</div>
<!--推荐排行榜结束-->

推荐歌手

先定一个规则,取单曲最多的六位歌手。

推荐歌手视图

返回单曲最多的六位歌手,还是在原来的基础上增加歌手的查询并返回给模板。

代码如下:

python 复制代码
def index(request):
    """ 显示首页 """
    ......

    # 推荐歌手 取单曲最多的六个
    singlers = Singler.objects.order_by('-singe_num').all()[0:6]

    return render(request, 'index/index.html', {
        'carousels': carousel_imgs,
        'songsheets': songsheets,
        'hot_ranks': hot_ranks,
        'new_ranks': new_ranks,
        'biao_ranks': biao_ranks,
        'ea_ranks': ea_ranks,
        'js_ranks': js_ranks,
        'singlers': singlers
    })

推荐歌手模板

模板样式都已经写好了,只需要在循环中解析和赋值就可以了。

代码如下:

html 复制代码
<!--推荐歌手开始-->
<div class="recommend_singler">
    <div class="title">
        <div class="name">推荐歌手</div>
        <ul>
            <li><a class="now" href="#">华语</a></li>
            <li><a href="#">欧美</a></li>
            <li><a href="#">日韩</a></li>
            <li><a href="#">组合</a></li>
            <li><a href="#">更多></a></li>
        </ul>
    </div>
    <div class="list">
        {% for sg in singlers %}
        <div class="item">
            <div class="cover">
                <img src="/media/{{sg.portrait}}" alt="">
            </div>
            <p class="name">{{sg.name}}</p>
            <p class="num">{{sg.singe_num}}首歌曲</p>
        </div>
        {% endfor %}
    </div>
</div>
<!--推荐歌手结束-->

总结

做推荐页开发暂时就这样了还是比较顺利的,只有在外键显示那边费了点事,还是对django部分不了解才导致的,这也是做项目的目的,能够比较全面的使用框架的功能,增进对框架的了解。

相关推荐
上进小菜猪35 分钟前
把 KES 集群交给 Kubernetes 的九十天:一个 DBA 的试用实录
后端
两点王爷1 小时前
PostgreSQL 常用 SQL 语句与 GIS 相关函数详解
数据库·后端
麻雀飞吧1 小时前
先判断工具用来学习、开发还是执行
人工智能·python
考虑考虑2 小时前
Springboot环境变量占位符语法
spring boot·后端·spring
人邮异步社区2 小时前
学习Python的最佳学习路径是什么?
python·程序员
步行cgn4 小时前
Spring 基于 XML 的自动装配:byName 详解
java·后端·spring
troy1284 小时前
Python 基础语法(九):Django/Flask/FastAPI 三大 Web 框架详细对比解析
python·jupyter·django·flask·github·fastapi
jzshmyt4 小时前
我用 Python 从零“生成“了一个宇宙,然后让它观察自己(v14)
人工智能·pytorch·python·numpy·matplotlib·空间计算·scipy
高洁015 小时前
大模型的幻觉怎么治
人工智能·深度学习·django·transformer·tornado
RISCV_Explorer5 小时前
RISC-V启动与运行时规范机制解析——BRS约定、HSM多核启动与设备树要求
后端·risc-v