我已经为此苦苦挣扎了很长时间,以至于我已接近抑郁症。
我有一个名为“Song”的模型,看起来像这样。
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 文件时,它会创建此模型的一个实例,并使用此 View 将文件存储在 myapp/songdir/中:
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”的模板,它显示了我从保存的模型实例中获得的歌曲列表:
{% 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 %}
当我单击此链接之一时,我希望呈现一个新模板,其中包含一个元素,用于播放我单击的名称的歌曲。我渲染的模板是这样的:
{% 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 %}
我用来交付它的 View 如下:
def playAudioFile(request, songtitle):
name = urllib.unquote(songtitle)
song = get_object_or_404(Song, title=name )
return render(request, 'playlist.html', {'link': song.songfile })
出于某种原因,我无法让它在音频元素中播放歌曲,我不知道还能尝试什么。
先谢谢了。
最佳答案
您应该添加 MEDIA_ROOT 和 MEDIA_URL 配置。处理事情会很容易。这是您的问题的解决方案。
在 settings.py 中:
MEDIA_ROOT=os.path.join(BASE_DIR,"songdir")
MEDIA_URL='/media/'
同样在 settings.py 添加
'django.template.context_processors.media',
在 TEMPLATES 选项的 context_processors 中。
在项目/urls.py 中:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
然后你可以简单地使用:
{{link.url}}
而不是在您的模板文件中对其进行硬编码。
关于django - 在 Django 模板中播放 <audio></audio> 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32668959/