访问 Django 中的“ Media”文件

我很想喜欢 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" />

谁能告诉我这里发生了什么,并给我一个简单的配方设置媒体文件处理?

非常感谢。


@ Timmy O’Mahony-谢谢! 史诗般的帖子,非常清晰。但是它留下了几个问题:

(1)我必须使用 /media//static/,而不是 media/static/作为 MEDIA_URLSTATIC_URL-我遗漏了什么吗?

(2)如果 collectstatic软管 /static/,你把网站层的 CSS 例如网站的 CSS 文件放在哪里?显然在 /static/里没有。

(3)我将它们放在项目根目录的“ _”目录中,并设置 STATICFILES_DIRS指向它——尽管有 urlpatterns指令,但这似乎是开发服务器获取静态文件的地方。如果这是错误的,那么在开发过程中你把站点级别的 CSS 放在哪里,当你修改它们时,围绕 collectstatic的工作流是什么——你是否必须在一个地方编辑它们,并在每次编辑后在其他地方收集它们?

102768 次浏览

你为什么把 MEDIA_ROOT设为空白?它需要是您的媒体目录的路径。因为正如您所说的,媒体位于一个名为 media的子目录中,所以您应该将其放在 MEDIA_ROOT中。

文件夹设置:

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

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

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

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


设置:

MEDIA _ ROOT 是上面提到的静态文件夹的绝对服务器路径:

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,那么您需要正确地向这些文件夹提供所有请求。

通常,当您在生产中,您希望网络服务器照顾您的静态文件和媒体文件。

如果您正在开发,那么可以让 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 文件,那么您可能不希望将它们放到一个单独的/static/文件夹中。把它们放在它们所属应用程序的子文件夹中可能会有用:

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

现在,您的 webserver/development 服务器只需要查找您让它查找的静态文件(即根静态文件夹) ,因此您需要收集子文件夹中的所有文件并将它们复制到根静态文件夹。您可以手动完成这项工作,但是 django 提供了一个命令来为您完成这项工作(这就是静态应用程序的全部意义所在)

./manage collectstatic

我遵循 timmy 过程,但是我得到一个错误,没有模块名称 django.views。当我在 Virtual alenv 中使用 import django.views时,一切都很正常,也就是说,导入库不会出现问题。

然而,我能够解决这个问题通过遵循这个过程在我的主网址文件

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/

设置中,确保添加

上下文处理器。媒体

否则,当您在模板中使用 MEDIA _ ROOT 时,它将无法工作。

我使用的是 Django 1.10,我的媒体文件夹是“上传” 这是我的 setings.py 中的配置:

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

在模板中,我将名称 o my MEDIA _ URL 放在 de object.name 之前,而不是 object.url,如下所示:

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

对我来说很有用。 希望这个能帮上忙。

我也有同样的问题,所以我加了这些台词

from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static


urlpatterns = [
url(r'', include('blog.urls')),
url(r'^admin/', admin.site.urls),
url(r'^cadmin/', include('cadmin.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

在 Django 项目配置目录的 urls.py中。更多信息: https://overiq.com/django/1.10/handling-media-files-in-django/

还有另一种选择:

在‘ setings.py’中设置媒体配置如下:

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

让我们说我有一个模态称为人与图像归档如下:

class Person(models.Model):
name = models.CharField(max_length = 30)
photo = models.ImageField(upload_to = 'photos')

现在,我们要讨论的上传路径位于 MEDIA _ ROOT 文件夹中。在我的情况下,将创建一个媒体文件夹中的照片文件夹将被创建,我们的媒体在这里将被转储。

所以现在在我的模板中,我做了这样的事情:

<img src="\{\{ person.photo.url}} />

简而言之,你有一个字段,像这样使用它:

src =\{\{ object.field.url}}

希望这有帮助! 编码愉快!

对于 Django 版本3,我使用了以下内容:

from django.conf import settings
from django.urls import re_path
from django.views.static import serve


# ... the rest of your URLconf goes here ...


if settings.DEBUG:
urlpatterns += [
re_path(r'^media/(?P<path>.*)$', serve, {
'document_root': settings.MEDIA_ROOT,
}),
]

我的设置

BASE_DIR = Path(__file__).resolve().parent.parent
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
STATIC_URL = '/static/'

这里有一个文档链接 < a href = “ https://docs.djangoproject.com/en/3.1/ref/views/”rel = “ nofollow norefrer”> https://docs.djangoproject.com/en/3.1/ref/views/ 如果您正在使用 Django REST 和一些开发服务器,不要忘记更新您的开发代理设置,以将 /media重定向到 Django 后端