我试图通过Django管理员上传一个图像,然后在前端的页面或只是通过URL查看该图像。

注意,这些都在我的本地机器上。

我的设置如下:

MEDIA_ROOT = '/home/dan/mysite/media/'

MEDIA_URL = '/media/'

我已经将upload_to参数设置为'images',文件已经正确上传到目录:

'/home/dan/mysite/media/images/myimage.png'

然而,当我试图访问下面的URL图像:

http://127.0.0.1:8000/media/images/myimage.png

我得到一个404错误。

我是否需要为上传的媒体设置特定的URLconf模式?

任何建议都很感激。

谢谢。


当前回答

这里是我在Django 2.0中所做的。在setting.py中将“First MEDIA_ROOT”设置为“MEDIA_URL”

MEDIA_ROOT = os.path.join(BASE_DIR, 'data/') # 'data' is my media folder
MEDIA_URL = '/media/'

然后通过添加在TEMPLATE_CONTEXT_PROCESSORS中启用媒体context_processors

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            #here add your context Processors
            'django.template.context_processors.media',
        ],
    },
},
]

您的媒体上下文处理器是启用的,现在每个RequestContext将包含一个变量MEDIA_URL。

现在你可以在template_name.html中访问它

<p><img src="{{ MEDIA_URL }}/image_001.jpeg"/></p>

其他回答

加入Micah Carrick对django 1.8的回答:

if settings.DEBUG:
  urlpatterns.append(url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}))

将此代码添加到settings.py中

urlpatterns = [ 

....

....


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

我是否需要为上传的媒体设置特定的URLconf模式?

是的。对于开发,这就像添加到你的URLconf一样简单:

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

然而,对于生产,你会想要使用Apache、lighttpd、nginx或你喜欢的web服务器来服务媒体。

对于Django 1.9,你需要根据文档添加以下代码:

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)

欲了解更多信息,请访问:https://docs.djangoproject.com/en/1.9/howto/static-files/#serving-files-uploaded-by-a-user-during-development

对于调试模式,执行上述步骤=>3.0

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

这也是我发现的部分,上面的静态URL只在我的主项目urls.py文件中工作。我第一次尝试添加到我的应用程序,并想知道为什么我不能看到图像。

最后确保你设置了以下内容:

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