Django:为什么我的视频不能在模板中显示? (错误 "No video with supported format and MIME type found")

Django: Why won't my video display in template? (Error "No video with supported format and MIME type found")

我有一个页面,用户可以在其中执行几项操作,并且应该显示用户上传的视频,但我收到此错误(“未找到支持格式和 MIME 类型的视频”),尽管 - 我想想——我正在做的正是我在网上找到的几个地方。

这些是我在 settings.py 中的 MEDIA_ROOTMEDIA_URL:

MEDIA_URL = 'media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

media 目录中,我为每个用户创建了子目录,如果它们不存在的话,当用户创建项目并上传视频时创建。在用户子目录中,用户创建的每个项目都有一个目录。在这些文件中,存在几个文件,包括视频。所以,对于我现在正在做的测试,这是结构:

|— media
    |— user_3
        |— Test_project
            |— video_file.mp4
            |— irrelevant_file
            |— irrelevant _file   
            ...

该视频是 FileField 我称之为 Project 的模型。

在我看来,我获取了视频url并通过以下方式将其传递给模板:

(我省略了与此问题无关的任何代码部分)

def sample_view(request, project_id):
    
    video = Project.objects.get(pk=project_id).video_file.url
    # ... some irrelevant code
    
    # The formset has always worked. I am only showing it here just in case it's relevant as to how I'm passing the context to the template.
    context = {'formset': formset, 'video': video}

    return render(request, 'AppDir/editor.html', context}

在我的模板中:

<video width="320" height="240" controls>
    <source src="{{ video }}" type="video/mp4">
</video>

所有这些导致我提到的错误。

为了查看到底传递给模板的是什么,我将我的视频变量(在我看来)打印到控制台,并在我的模板中创建了一个 <p>{{ video }} 来查看它也在那里。在两者中我都得到了:media/user_3/Test_project/video_file.mp4

这在我的浏览器检查器中正确显示为 src 属性。

我也尝试使用 Project.objects.get(pk=project_id)(而不是 Project.objects.get(pk=project_id).video_file.url)进行查询,然后在我的模板 <source src="{{ video.video_file.url }}" type="video/mp4"> 中使用它,但我得到了同样的错误。

我觉得有趣并且我认为可能是问题的原因——我不知道如何解决——是,在控制台中,当我转到页面时,我看到:

Not found: editor/206/media/user_3/Test_project/video_file.mp4

... some other things

Not found: /media

editor/206 是编辑器页面的 url,206 是我用来提供所有内容的项目的 pk。

根据文档所说 here,然后我将其添加到我的 URLconf 中:

from django.conf import settings
from django.conf.urls.static import static

url_patterns = [
    # ... some patterns
    path('editor/<int:project_id>/', views.sample_view, name='editor'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_URL)

我仍然遇到同样的错误。

所以,我猜这是由于浏览器试图在该文件夹 (editor/206/media/user_3/Test_project/video_file.mp4) 中查找视频造成的,该文件夹不存在。我认为将该代码片段添加到我的 URLconf 可能会解决这个问题,但事实并非如此。正如我所说,我发现有几个你只需要像我一样通过视频的url,但从未见过这样的事情。

您的 MEDIA_URL 设置已关闭。在你的 settings.py:

MEDIA_URL = '/media/' # need "/"
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

因为你的媒体url中没有/,你得到的url是media/user_3/Test_project/video_file.mp4。这只能附加到当前 url.

以下不是必须的,但最好这样做。因为我确定您在 Project 中还有其他字段要在模板中呈现。

观看次数。

def sample_view(request, project_id):
    
    project = Project.objects.get(pk=project_id) # use project 
    
    context = {'formset': formset, 'project': project} # use project

    return render(request, 'AppDir/editor.html', context}

并在模板中

<source src="{{ project.video_file.url }}" type="video/mp4">