找不到 Django 媒体文件 404

Posted

技术标签:

【中文标题】找不到 Django 媒体文件 404【英文标题】:Django media file not found 404 【发布时间】:2019-05-06 15:21:25 【问题描述】:

我有一个 Django 博客应用程序,其中在发布博客时,也可以附加和提交文件。

这里是views.py代码:

   def user_own_blog(request):
       if request.method == 'POST' and request.FILES['blog_document']:
            title_b = request.POST.get('blog_title')
            content_b = request.POST.get('blog_content')

            file1 = request.FILES['blog_document']
            fs = FileSystemStorage()
            document_name = fs.save(file1.name, file1)
            uploaded_document_url = fs.url(document_name)

            b = Blog(title=title_b, content=content_b, blog_document=uploaded_document_url)

            b.save()

            return render(request, 'mysite/portfolio.html')
      else:
            return render(request, 'mysite/blog.html')

这里是 MEDIA_ROOT 和 MEDIA_URL 路径名:

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

以下是 mysite 应用中 urls.py 的代码:

        urlpatterns=[ .....
        ......
        ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

这是项目结构,其中我需要媒体文件夹直接存在于 Assignment1 项目下

文件上传成功后,在/api中显示如下。

但是正在创建两个媒体路径:/media/media,如下所示:我无法找到我可能创建的重复字段。

点击文件链接:出现 404 not found 错误。我认为 MEDIA_ROOT 文件名不正确。

blog.html 的 HTML 代码:

     % extends 'mysite/base.html' %
       % load static %

     % block content %

<div class="container">
    <div class="row">
        <div class="col-sm-6 mx-auto" style="margin-top: 70px">
              <form action="% url 'user_own_blog' %" method="POST" enctype="multipart/form-data">
                         % csrf_token %
                   <div class="form-group row">
                     <label for="example-email-input" class="col-2 col-form-label">Title</label>
                    <div class="col-10">
                        <input name = "blog_title" class="form-control" type="text">
                    </div>
                </div>

                <div class="form-group row">
                    <label for="example-email-input" class="col-2 col-form-label">Content</label>
                    <div class="col-10">
                        <textarea name = "blog_content" class="form-control" rows = "5" cols = "50" type="text"> </textarea>
                    </div>
                </div>

                <div class="form-group row">
                    <label for="example-email-input" class="col-2 col-form-label">Upload File</label>
                    <div class="col-10">
                        <input name = "blog_document" class="form-control" type="file">
                    </div>
                </div>

                <div class="pull-right">
                    <button type="submit" class="btn btn-primary float-right">Post</button>
                </div>
            </form>
        </div>
    </div>

</div>

% endblock %

【问题讨论】:

您的媒体文件是否存在于您应用的媒体文件夹中? 不,它在主项目内,即 assignment1,不在“mysite”内 这是因为您的媒体根设置在项目文件中。对于完美的发展阶段。如果您希望它在您的应用程序文件夹中,请在媒体根目录中将其称为appname/media。但通常不推荐应用内的媒体文件和静态文件。 没有媒体文件直接位于项目中,而不是 appname/media 【参考方案1】:

如果要在根目录中定位上传的文件位置:

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

其他:

MEDIA_URL = '/media/'
MEDIA_ROOT = 'C:/Users/xyz/Assignment1/mysite/media/' #if windows pay attention to the slashes

您的网址也遵循此模式:

if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

编辑:我认为问题不在于媒体文件夹,而在于您如何保存和检索文档。下面我将放置正确上传和检索所需的部分。

models.py

blog_document= models.FileField()

views.py

def user_own_blog(request):

   if request.method == 'POST' and request.FILES:
       form = BlogForm(request.POST,
                       request.FILES)
       blog = Blog()
       if form.is_valid():
           blog.title_b = form.cleaned_Data['title']
           blog.content_b = form.cleaned_Data['content']
           blog.file = form.cleaned_Data['blog_document']
           blog.save()

        return HttpRequestRedirect(reverse('portfolio'))
    else:

        form = BlogForm()
    return render(request, 
                  'mysite/blog.html',
                  'form': form)

要检索上传文件的 url,有默认方法 .url。您只需将查询传递给模板 (Modelname.objects.filter(title__iexact='something'))

 query.file.url

注意:您需要在 forms.py 中创建一个表单(如果您不必创建一个)。并使用cleaned_data 方法从表单中检索值。对此进行研究。

【讨论】:

不,此方法无效,在单击 api 列表中的文件 url 链接时,仍然存在相同的 404 未找到错误 你自己创建过媒体文件夹吗? 不,在settings.py中创建MEDIA_URL和MEDIA_ROOT变量后,runserver后,主项目内自动创建了media文件夹 你能发布你的html吗?您以错误的方式检索文档【参考方案2】:

如果你已经在你的settings.py文件中添加了这个

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

你仍然收到 404 错误,那可能是因为你必须在 main urls.py 中添加 media_url

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

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

这是您可以添加它的方法。如果您想阅读更多详细信息,请阅读this article

【讨论】:

以上是关于找不到 Django 媒体文件 404的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中自定义找不到页面(404)?

URL 错误 404 找不到 Django 页面错误 x.html

Django:找不到页面(404)

在 Django 中使用 path() 找不到 404

找不到 Django Python 页面 (404)

在 Django 网站上找不到页面 404?