模板中的Django视频,似乎检测到媒体但不起作用

时间:2015-11-28 11:31:47

标签: django html5-video

我一直在研究这个问题,但似乎没有找到问题。我试图从上传的文件中获取视频以在模板上工作,但我不断得到的是一个空白视频,虽然当我查看页面源或检查视频元素时,它似乎指向正确的视频,我试图使这项工作的所有解决方案都证明是无效的。 以下是我的代码:

我的模特:

class Sermon(models.Model):
topic = models.CharField('Topic', max_length=50)
pub_date  = models.DateField('Sermon Date')
timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
last_edited = models.DateTimeField(auto_now_add=False, auto_now=True)
type = models.CharField('Type', max_length=50, choices=sermon_chioices)
audio = models.FileField(upload_to='audios', default="Not Available", blank=True, validators=[validate_audio_extension], null=True)
video = models.FileField(upload_to='videos', default="Not Available", blank=True)#can be changed if the video will recide in the system
outlines = models.FileField(upload_to="outlines", default="Not Available", blank=True,)
user = models.ForeignKey(User, verbose_name="User", editable=False)

class Meta:
    ordering = ['-pub_date']

def __unicode__(self):
    return self.topic

def get_absolute_url(self):
    #return reverse('sermon_detail', kwargs={'pk': self.pk})
    return reverse('sermon_detail', args=[str(self.id)])

我的观点:

class SermonDetails(DetailView):
    model = Sermon
    template_name = 'agonopa/sermon_details.html'
    context_object_name = 'sermon'

    def get_context_data(self, **kwargs):
        context = super(SermonDetails, self).get_context_data(**kwargs)
        #context['sermons'] = Sermon.objects.all()
        return context

#Sunday Service List
class SundayServiceSermonList(ListView):
    model = Sermon
    template_name = 'agonopa/sermon.html'
    context_object_name = 'sermon_list' #'ss_sermon_list'
    queryset = Sermon.objects.filter(type__exact="SUNDAY SERVICE")

    def get_context_data(self, **kwargs):
        context = super(SundayServiceSermonList, self).get_context_data(**kwargs)
        context['title'] = 'Sunday Service'
        return context

我的模板:

{% if sermon %}
    <h3>{{ sermon.topic}}</h3>
    {{sermon.outline}}
    {{ sermon.pub_date}}

 {% endif %}
 <video  loop class="embed-responsive-item thumbnails" controls>
        <source src="{{ MEDIA_URL}}{{sermon.video.url}}" type="video/mp4">
    </video>

MY MEDIA SETTINGS:

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_DIR = os.path.dirname(BASE_DIR)
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(PROJECT_DIR,'churchsite_static_root','media_root')

服务器在终端中返回这样的内容:

[28/Nov/2015 11:38:10]"GET /agonopa/sermon/3/ HTTP/1.1" 200 377
[28/Nov/2015 11:38:10]"GET /media/videos/wowo_Boyz_5gQAbzG.mp4 HTTP/1.1" 404 2344

先谢谢你的帮助,如有进一步澄清,请告诉我。 应该注意的是,我已经尝试了许多来自stakeoverflow的解决方案,而且几个博客似乎都没有用,所以我不得不在这里发布。

2 个答案:

答案 0 :(得分:1)

在我看来,你的MEDIA_ROOT太高了(就像在你的项目中一样)。当我使用您使用的设置时,相对于您的../../../churchsite_static_root/media_root/文件,我获得了settings.py的媒体根目录。我希望churchsite_static_root成为settings.py之上的一个目录(或与manage.py处于同一级别)。

进入Django shell并检查媒体根路径以查看它是否合理(并确认您的文件实际存在):

python manage.py shell
>>> from django.conf import settings
>>> settings.MEDIA_ROOT

settings.py中尝试以下操作,并告诉我它是否有帮助:

import os

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
MEDIA_ROOT = os.path.join(BASE_DIR, 'churchsite_static_root', 'media_root')

如果使用urls.py,请确保您的网站python manage.py runserver中有类似内容:

# For Django>=1.8:
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

# For Django<1.8:
if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^media/(?P<path>.*)$', 'django.views.static.serve', {
        'document_root': settings.MEDIA_ROOT}))

答案 1 :(得分:1)

我只是导入了设置,然后是静态的,还添加了if Debug:到我的urls.py,因此程序看起来如下:

Urls.py:

using Caliburn.Micro;

namespace CaliburnMicroExample
{
    public class ShellViewModel : PropertyChangedBase
    {
        private string _message;

        public string Message
        {
            get { return _message; }
            set
            {
                _message = value;
                NotifyOfPropertyChange(() => Message);
            }
        }

        public ShellViewModel()
        {
            Message = "Hello World";
        }
    }
}

这就是它的全部。感谢Mike Covington。 另请注意,上面的媒体设置,模板和其他文件并没有改变整个工作。