在Django中访问“媒体”文件

我想要喜欢Django,但是在开发环境中这种静态和媒体文件的业务正在让我疯狂。 请把我从我的愚蠢中解救出来。

我在我的开发机器上。 我有我的项目目录的根目录中的文件夹media

settings.py我有: MEDIA_ROOT = ''MEDIA_URL = '/media/'

urls.py我有:

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

但是我可以通过引用/media/media/例如<img src="/media/media/image.png" />来获取媒体文件。

我期望(并希望)
<img src="/media/image.png" />

任何人都可以告诉我这里发生了什么,给我一个简单的configuration,设置媒体文件处理?

非常感谢你。


@Timmy O'Mahony – 谢谢! 史诗般的post,非常清楚。 但是这留下了一些问题:

(1)我必须使用/media//static/ ,而不是media/static/作为MEDIA_URLSTATIC_URL – 我错过了什么?

(2)如果是/static/软pipe/static/ ,你在哪里把网站级别的CSS,如网站的CSS文件? 不在/static/ ,显然。

(3)我将它们放在项目根目录下的“_”目录下,并将STATICFILES_DIRS设置为指向它 – 这似乎是开发服务器获取其静态文件的位置,尽pipe使用了urlpatterns指令。 如果这是错误的,那么你在开发过程中把CSS放在什么位置?当你修改它时,你需要将它们编辑到一个地方,并在每次编辑之后把它们收集到别的地方。

你为什么把MEDIA_ROOT设置为空? 它需要成为您的媒体目录的path。 因为,正如你所说,你的媒体是在一个名为media的子目录,你应该把它放在MEDIA_ROOT

文件夹设置:

你的项目根目录应该是这样的:

 /app1 /app2 /media /static /templates urls.py settings.py manage.py 

媒体文件夹应该保存在正常使用网站期间可能上传的图像,下载和其他材料(即开发完成后)

静态文件夹应该保存所有的CSS / JS和其他材料,这是网站开发的一部分


Settings.py:

MEDIA_ROOT是上面提到的静态文件夹的绝对服务器path。 这意味着它应该是这样的:

 MEDIA_ROOT = "/User/Bob/Sites/MySite/Project_root/media/" 

MEDIA_URL是您在查看网站时应该访问媒体文件的相对浏览器url。 它应该(通常)

 MEDIA_URL = "media/" 

这意味着所有资料可以在http://example.com/media/上查看;

同样, STATIC_ROOT应该是类似的

 STATIC_ROOT = "/User/Bob/Sites/MySite/Project_root/static/" 

STATIC_URL

 STATIC_URL = "static/" 

提供文件:

现在你已经告诉Django这些文件夹应该在哪里,以及正确的URL来访问它们,你需要正确地提供所有的请求到文件夹。

通常当你在制作时,你需要web服务器来照顾你的静态文件和媒体文件。

如果你正在开发,你可以让django开发服务器为你服务。

为此,请告诉它将进入http://example.com/media的所有请求路由到您的MEDIA_ROOT,并将所有进入http://example.com/static的请求路由到您的STATIC_ROOT。;

要做到这一点,你需要像URLS.py一样添加一些URL:

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

额外

如果你有多个应用程序,每个应用程序都有自己的CSS和JS文件,你可能不想把它们扔到一个单一的/静态/文件夹。 将它们放在它们所属的应用程序的子文件夹中可能是有用的:

 /app1/static/ # Specific static folder /app2/static/ /media/ /static/ # Root static folder 

现在,你的web服务器/开发服务器只是寻找静态文件,你告诉它看起来(即根静态文件夹),所以你需要收集子文件夹中的所有文件,并将其复制到根静态文件夹。 你可以手工做到这一点,但Django提供了一个命令为你做这个(这是静态应用程序的整个点)

 ./manage collectstatic 

我遵循timmy程序,但我得到一个错误,没有模块名称django.views 。 当我在我的virtualenv中使用import django.views ,一切正常,这不是导入库的问题。

但是,我能够通过在我的主要URL文件中遵循这个过程来解决这个问题

 from django.conf.urls.static import static urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

https://docs.djangoproject.com/en/dev/howto/static-files/

在你的settings.py中 ,确保你添加了

django.core.context_processors.media

在您的TEMPLATE_CONTEXT_PROCESSORS.Otherwise MEDIA_ROOT将不起作用,当您在模板中使用它。

我正在使用Django 1.10。 而我的媒体文件夹是“上传”这是我settings.py中的configuration:

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

而在模板中,我将MEDIA_URL的名称放在de object.name之前,而不是object.url,如下所示:

  <img src="uploads/{{ imagen_identificativa.name }} " alt="{{imagen_identificativa}}"> 

它适用于我。 我希望这有帮助。