首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在django模板中播放<audio></audio>文件

在django模板中播放<audio></audio>文件
EN

Stack Overflow用户
提问于 2015-09-19 21:47:14
回答 1查看 11.2K关注 0票数 3

我已经与此抗争了很长时间,以至于我都快要抑郁了。

我有一个叫"Song“的模型,看起来像这样。

代码语言:javascript
运行
复制
from django.db import models

class Song(models.Model):
    title = models.CharField(max_length=100)
    songfile = models.FileField()
    duration = models.FloatField()
    isPlaying = False

    def __str__(self):
        return self.title

当您从索引页面上传mp3文件时,它会创建此模型的一个实例,并使用此视图将该文件存储在myapp/songdir/中:

代码语言:javascript
运行
复制
def home(request):

    if request.method == 'POST':
        form = UploadForm(request.POST, request.FILES)
        if form.is_valid():
            song_title = request.POST.items()[1][1]
            song_address = 'upnplay/songdir/' + song_title + '.mp3'
            with open(song_address, 'wb+' ) as destination:
                for chunk in request.FILES['file'].chunks():
                    destination.write(chunk)
                audio = MP3(song_address)
                c = Song(title = song_title, songfile = song_address, duration = audio.info.length)
                c.save()
            return HttpResponseRedirect('')
    else:
        form = UploadForm()
    c = {'form': form}
    c.update(csrf(request))
    return render(request, 'index.html', {'form': form})

然后我有一个名为"choosesong“的模板,它显示了我从保存的模型实例中获得的歌曲列表:

代码语言:javascript
运行
复制
{% extends 'index.html' %}


{% block content %}
<div class="row">
    {% for song in playlist %}
        <a href="playlist/{{song.title}}/"><h3>{{song.title}} -- {{song.duration}}</h3></a>
    {% endfor %}
</div>

{% endblock %}
{% block form %}{% endblock %}

当我单击其中一个链接时,我希望呈现一个新的模板,其中包含一个播放我所单击的歌曲名称的元素。我呈现的模板是这样的:

代码语言:javascript
运行
复制
{% extends 'index.html' %}

{% block content %}

<div class='row'>
    {{link}}
    <audio controls>
        <source src="../../{{ link }}" type="audio/mpeg">
        Your browser does not support the audio element.
    </audio>
</div>

{% endblock %}

我用来交付它的视图如下:

代码语言:javascript
运行
复制
def playAudioFile(request, songtitle):
    name = urllib.unquote(songtitle)
    song = get_object_or_404(Song, title=name )
    return render(request, 'playlist.html', {'link': song.songfile })

由于某些原因,我不能让它在audio元素中播放歌曲,我不知道还可以尝试什么。

事前谢谢你。

EN

回答 1

Stack Overflow用户

发布于 2015-09-19 23:40:31

您应该添加MEDIA_ROOT和MEDIA_URL配置。事情会变得很容易处理。以下是您的问题的解决方案。

在settings.py中:

代码语言:javascript
运行
复制
MEDIA_ROOT=os.path.join(BASE_DIR,"songdir")
MEDIA_URL='/media/'

同样在settings.py中,在TEMPLATES选项的context_processors中添加'django.template.context_processors.media‘。

在project/urls.py中:

代码语言:javascript
运行
复制
from django.conf import settings
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

然后,您可以简单地使用:

代码语言:javascript
运行
复制
{{link.url}} 

而不是在模板文件中对其进行硬编码。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32668959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档