Django - 为用户上传的媒体文件提供服务
Posted
技术标签:
【中文标题】Django - 为用户上传的媒体文件提供服务【英文标题】:Django - Serving user uploaded media files 【发布时间】:2016-04-04 23:53:47 【问题描述】:我正在尝试在 DetailView 的模板上显示媒体文件(图像)。
我运行打印语句来检查 MEDIA_ROOT 和 MEDIAFILES_DIRS 指向的位置,它们都正确指向 /project/static/media。
所以我尝试使用 <img src=" object.profile_pic.url " />
在 html 页面上调用它,但它没有显示。
我查看控制台,它正在寻找 XXX.X.X.X:8000/media/image_file.jpg 中的文件。
这与我在 settings.py 中的 MEDIA FILES 设置有关吗?
这就是我的文件夹结构的样子
/project
/project
/project
urls.py (base)
/apps
/app1
urls.py
manage.py
/static
/media
image_file.jpg
settings.py
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Static files (CSS, javascript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(os.path.dirname(BASE_DIR), "static", "static_files"),
]
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static", "static_root")
"""
MEDIA FILES
"""
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static", "media")
MEDIAFILES_DIRS = [
os.path.join(os.path.dirname(BASE_DIR), "static", "media"),
]
"""
Override the BaseUser model
"""
AUTH_USER_MODEL = 'accounts.User'
urls.py // 需要将 +static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 添加到基本 urls.py,而不是应用级别
from django.conf.urls import include, url
from django.contrib import admin
from . import views
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
url(r'^$', views.HomepageTemplateView.as_view(), name='home'),
url(r'^how-it-works/$', views.HowItWorksTemplateView.as_view(), name='how-it-works'),
url(r'^categories/', include('apps.categories.urls')),
url(r'^tasks/', include('apps.tasks.urls')),
url(r'^accounts/', include('apps.accounts.urls')),
url(r'^admin/', admin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
detailview.html
% extends 'base.html' %
% block navbar %
<div class="row">
<div class="container">
% include 'navbar.html' %
</div>
</div>
% endblock %
% block content %
<div class="row">
<div class="container">
<div class="col-md-12">
% load staticfiles %
<p><img src=" object.profile_pic.url " /></p>
<p> object.username </p>
<p> object.first_name object.last_name </p>
<p> object.email </p>
<p> object.contractorprofile.subcategory </p>
</div>
</div>
</div>
% endblock %
【问题讨论】:
urls.py
文件的路径是什么?它属于您的应用程序之一还是属于项目级别的基础 urls.py?
这是一个应用级别。所以它在 /accounts/urls.py 中。你说我粘贴的 urls.py 代码是从哪里来的吧?
是这样想的。您能否编辑问题并添加基础urls.py
的相关部分,并使用两个 urls.py 位置更新您的文件夹结构?
好吧,你刚刚解决了!哈哈。这是因为我将 + 设置...放在应用程序 urls.py 而不是基本 urls.py
【参考方案1】:
您将static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
行添加到特定应用程序 的urls.py
,即不是基本级别的urls.py。基本级别将include
应用程序特定的 url 附加到某个词干。如果基本 urls.py 有这样的内容,url(r'^apps/', include('apps.app1.urls')),
然后将浏览器指向server:8000/apps/media/image_file.jpg
。
这不是您想要的,因此将 static() MEDIA_URL 调用移至 基础项目级 urls.py
。
让我提一些其他的事情。您的文件夹结构将media/
放在static/
下;这很令人困惑。您还为 STATIC 和 MEDIA 添加了 settings
。静态文件和媒体文件是完全独立的(经常混淆)主题。您的代码使用静态文件。静态文件是您的应用程序需要的 CSS、JavaScript、图像等。媒体文件是通过使用应用程序而产生的资产——图像、文档等。 profile_pic
在你的例子中是一个完美的媒体例子;这是用户上传的东西。因此,将您的媒体目录嵌套在 static/ 下会将两个独立的东西混为一谈。不要这样做。
另外,模板中不需要% load staticfiles %
。这用于静态文件提供的模板标签,例如您未使用的 % static ...%
。无论如何,您应该在文件顶部加载模板标签以保持干净。
【讨论】:
以上是关于Django - 为用户上传的媒体文件提供服务的主要内容,如果未能解决你的问题,请参考以下文章