Django - 为用户上传的图像提供服务

时间:2012-12-16 12:15:39

标签: python django media

我在从Django应用程序提供用户上传文件时遇到一些问题:

来自models.py的

class Picture (models.Model):

    title = models.CharField(max_length=48)

    date_added = models.DateTimeField(auto_now=True)

    content = models.ImageField(upload_to='pictures')

从Django管理员处将文件上传到user_res / pictures /文件夹。

来自项目的settings.py:

MEDIA_ROOT = 'user_res'

MEDIA_URL = '/user_res/'

STATIC_ROOT = ''

STATIC_URL = '/static/'

每当我尝试引用静态资源(即css或js文件)时,使用诸如

之类的URL一切正常
http://localhost:8000/static/<subfolder>/main.css.

但是,我无法访问用户上传的文件(由user_res / pictures文件夹中的管理界面创建,并带有相对URL,例如

user_res/pictures/test.jpg

使用来自可调用的Django Picture模型的这行代码动态创建URL:

return '<img src="{}"/>'.format(self.content.url)

url.py文件中没有静态或媒体文件的专用url-。

有没有人知道如何让Django提供媒体文件?我知道对于实时环境,我需要配置一个http服务器来服务该特定目录,但是现在我想维护一个轻量级的开发套件。

谢谢。

2 个答案:

答案 0 :(得分:6)

编辑urls.py文件,如下所示。

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

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

将您的项目settings.py编辑为:

#Rest of the settings
MEDIA_URL = '/media/'
MEDIA_ROOT = 'media'
STATIC_ROOT = ''
STATIC_URL = '/static/'

请仔细阅读有关提供用户上传文件的官方Django文档。链接到文档:https://docs.djangoproject.com/en/1.5/howto/static-files/#serving-files-uploaded-by-a-user

答案 1 :(得分:0)

我认为url属性会返回一个相对网址(Django's FileField documentation),所以你应该有:

return '<img src="{}"/>'.format(MEDIA_URL + self.content.url)

相对URL无效,因为访问“http:// localhost / books /”的用户将请求“http://localhost/books/user_res/pictures/test.jpg”。