1

我正在尝试在 DetailView 的模板上显示媒体文件(图像)。

我运行打印语句来检查 MEDIA_ROOT 和 MEDIAFILES_DIRS 指向的位置,它们都正确指向 /project/static/media。

所以我尝试通过使用在html页面上调用它<img src="{{ object.profile_pic.url }}" />,但它没有显示。

我检查了控制台,它正在寻找 XXX.XXX:8000/media/image_file.jpg 中的文件。

这与我在 settings.py 中的媒体文件设置有关吗?

这就是我的文件夹结构的样子

/project
  /project
    /project
       urls.py (base)
    /apps
      /app1
        urls.py
    manage.py
  /static
    /media
      image_file.jpg

设置.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)

详细视图.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 %}
4

1 回答 1

4

您将该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/; 这很令人困惑。您还包括了settingsSTATIC 和 MEDIA。静态文件和媒体文件是完全独立(经常混淆)的主题。您的代码使用静态文件。静态文件是您的应用程序需要的 CSS、JavaScript、图像等。媒体文件是通过使用应用程序而产生的资产——图像、文档等。profile_pic在您的情况下是媒体的完美示例;这是用户上传的东西。因此,将您的媒体目录嵌套在 static/ 下会将两个独立的东西混为一谈。不要这样做。

另一件事,您不需要{% load staticfiles %}在模板中。这用于{% static ...%}您未使用的静态文件提供的模板标签。无论如何,您应该在文件顶部加载模板标签以保持干净。

于 2015-12-31T00:58:49.713 回答