使用Django框架实现音频上传功能

数据库设计(models.py

python 复制代码
class Music(models.Model):
    """ 音乐 """
    name = models.CharField(verbose_name="音乐名字", max_length=32)
    singer = models.CharField(verbose_name="歌手", max_length=32)

    # 本质上数据库也是CharField,自动保存数据。
    music = models.FileField(verbose_name="音频", max_length=128)

链接(urls.py

python 复制代码
# 音频上传
    path('music/upload/', music.music_upload),
    path('music/add/', music.music_add),

处理代码(music.py

python 复制代码
from django.shortcuts import render, redirect
from app01 import models


def music_upload(request):
    queryset = models.Music.objects.all()
    return render(request, 'music_upload.html', {'queryset': queryset})


from app01.utils.bootstrap import BootStrapModelForm


class UpModelForm(BootStrapModelForm):
    bootstrap_exclude_fields = ['music']

    class Meta:
        model = models.Music
        fields = "__all__"


def music_add(request):
    """ 上传文件和数据 """
    title = "音频上传"
    if request.method == "GET":
        form = UpModelForm()
        return render(request, 'upload_form.html', {"form": form, "title": title})

    form = UpModelForm(data=request.POST, files=request.FILES)
    if form.is_valid():
        # 对于文件:自动保存;
        # 字段 + 上传路径写入到数据库
        form.save()

        return redirect("/music/upload/")
    return render(request, 'upload_form.html', {"form": form, "title": title})

前端页面(music_upload.html)

html 复制代码
{% extends 'layout.html' %}

{% block content %}
    <div class="container">
        <div style="margin-bottom: 10px">
            <a class="btn btn-success" href="/music/add/" target="_blank">
                <span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>
                音频上传
            </a>
        </div>

        <div class="panel panel-default">
            <!-- Default panel contents -->
            <div class="panel-heading">
                <span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>
                音频列表
            </div>

            <!-- Table -->
            <table class="table table-bordered">
                <thead>
                <tr>
                    <th>音频</th>
                    <th>音乐名称</th>
                    <th>歌手</th>
                </tr>
                </thead>
                <tbody>
                {% for obj in queryset %}
                    {% if obj.music.name|slice:'-4:' == ".mp3" %}
                        <tr>
                            <td>
                                {% if obj.music.name|slice:'-4:' == ".png" %}
                                    <img src="/media/{{ obj.music }}" style="height: 80px;">
                                {% else %}
                                    <audio controls>
                                        <source src="/media/{{ obj.music }}">
                                    </audio>
                                {% endif %}
                            </td>
                            <td>{{ obj.name }}</td>
                            <td>{{ obj.singer }}</td>
                        </tr>
                    {% endif %}
                {% endfor %}
                </tbody>
            </table>
        </div>
        <div class="clearfix">
            <ul class="pagination" style="float:left;">
                {{ page_string }}
            </ul>
        </div>
    </div>
{% endblock %}

前端页面(upload_form.html)

html 复制代码
{% extends 'layout.html' %}

{% block content %}
    <div class="container">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title">{{ title }}</h3>
            </div>
            <div class="panel-body">
                <form method="post" enctype="multipart/form-data" novalidate>
                    {% csrf_token %}
                    {% for field in form %}
                        <div class="form-group">
                            <label>{{ field.label }}</label>
                            {{ field }}
                            <span style="color: red;">{{ field.errors.0 }}</span>
                        </div>
                    {% endfor %}

                    <button type="submit" class="btn btn-primary">提 交</button>
                </form>
            </div>
        </div>
    </div>
{% endblock %}

页面展示

相关推荐
静小谢6 小时前
前后台一起部署,vite配置笔记base\build
前端·javascript·笔记
用户47949283569157 小时前
改了CSS刷新没反应-你可能不懂HTTP缓存
前端·javascript·面试
还好还好不是吗7 小时前
老项目改造 vue-cli 2.6 升级 rsbuild 提升开发效率300% upupup!!!
前端·性能优化
sumAll7 小时前
别再手动对齐矩形了!这个开源神器让 AI 帮你画架构图 (Next-AI-Draw-IO 体验)
前端·人工智能·next.js
OpenTiny社区7 小时前
2025OpenTiny星光ShowTime!年度贡献者征集启动!
前端·vue.js·低代码
wangan0947 小时前
不带圆圈的二叉树
java·前端·javascript
狗哥哥7 小时前
从零到一:打造企业级 Vue 3 高性能表格组件的设计哲学与实践
前端·vue.js·架构
疯狂平头哥7 小时前
微信小程序真机预览-数字不等宽如何解决
前端
Drift_Dream7 小时前
前端趣味交互:如何精准判断鼠标从哪个方向进入元素?
前端
hqk7 小时前
鸿蒙ArkUI:状态管理、应用结构、路由全解析
android·前端·harmonyos