2015-12-31 7 views
1

Я пытаюсь отобразить медиафайл (изображение) на шаблоне DetailView.Django - Обслуживание загруженных пользователем медиафайлов

Я запускал операторы печати, чтобы проверить, где указываются MEDIA_ROOT и MEDIAFILES_DIRS, и оба они правильно указывают/project/static/media.

Поэтому я пытаюсь вызвать его на странице html с помощью <img src="{{ object.profile_pic.url }}" />, но он не отображается.

Я проверяю консоль и ищет файл в XXX.X.X.X: 8000/media/image_file.jpg.

Это как-то связано с настройкой MEDIA FILES в settings.py?

Это как моя структура папок выглядит

/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 // нужно добавить + статический (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 %} 
+1

Каков путь к файлу 'urls.py'? Это принадлежит одному из ваших приложений или это уровень проекта, базовый urls.py? – JCotton

+0

это уровень приложения. поэтому его в /accounts/urls.py. вы говорите, где код urls.py, который я вставил, исходит справа? – Chris

+0

думал так. Не могли бы вы отредактировать вопрос и добавить соответствующую часть базы 'urls.py', а также обновить структуру папок с обоих мест urls.py? – JCotton

ответ

3

Вы добавили 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.

Это не то, что вы хотите, поэтому переместите вызов статического() MEDIA_URL на базу , уровень проектаurls.py.

Позвольте мне упомянуть еще пару вещей. Ваша структура папок помещает media/ под static/; это довольно запутанно. Вы также включили settings для STATIC и MEDIA. Статические файлы и мультимедийные файлы полностью разделены (часто перепутаны). Ваш код использует статические файлы. Статические файлы - это CSS, JavaScript, изображения и т. Д., Которые необходимы вашему приложению. Медиа-файлы - это объекты-изображения, документы и т. Д., Которые начисляются через использование приложения. profile_pic в вашем случае - прекрасный пример СМИ; это то, что пользователь загрузил. Таким образом, размещение вашего медиа-каталога под static/объединяет две независимые вещи. Не делай этого.

Другое дело, что вам не нужно {% load staticfiles %} в шаблоне. Это используется для статических файлов templatetags, таких как {% static ...%}, которые вы не используете. В любом случае, вы должны загрузить templatetags в верхней части файла, чтобы все было в порядке.