我试图在DetailView的模板上显示媒体文件(图片)。
我运行了print语句来检查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 %}
答案 0 :(得分:3)
您已将static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
行添加到特定应用的urls.py
,即不是基本级别urls.py.基本级别将include
特定于应用的网址附加到某个词干。如果基本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 ...%}
,您没有使用。无论如何,你应该在文件顶部加载templatetags以保持清洁。