Джанго показывает ImageField

Я расширил базового пользователя из Django с помощью метода OneToOne.

class Employee(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE)
    floor = models.CharField(max_length = 100)
    avatar = models.ImageField(upload_to='userimages')

Изображение загружается в media/userimages.

Сейчас при попытке показать аватарку пробую вот так, а он ничего не показывает.

<img src="media/{{ user.employee.avatar.url }}" alt="">

Если я просто выведу user.employee.avatar.url, я получу:

'media/userimages/name.jpg'

Изображение есть в этой папке, но его нет на сайте.

Я действительно не могу понять, почему это не работает. Любая помощь приветствуется.


person Adrian    schedule 28.02.2018    source источник
comment
Какой вывод вы видите, когда просматриваете исходный код в браузере? Просматривает ли 127.0.0.1:8000/app/static/userimages/name.jpg показать правильное изображение?   -  person Adam Barnes    schedule 28.02.2018
comment
@AdamBarnes не отображается, потому что не настроен в urls.py   -  person Adrian    schedule 28.02.2018
comment
@YannicHamann, когда я пытался таким образом, я получаю TemplateSyntaxError Не удалось проанализировать остаток:   -  person Adrian    schedule 28.02.2018
comment
При использовании тега шаблона {% static %} вам необходимо сначала {% load static %}.   -  person Adam Barnes    schedule 28.02.2018
comment
То, что у вас есть на данный момент, выглядит правильно. Однако пара вопросов в порядке. Ваш базовый каталог называется app? Если это так, вам нужно удалить app/static и просто использовать userimages в качестве значения upload_to. Также проверьте настройки Django, что установлен правильный MEDIA_ROOT. Я не уверен, что вы хотите загружать фотографии пользователей в статический каталог, потому что безопасность. Если это так, вам может потребоваться подкласс FileSystemStorage, чтобы сделать это. Подробнее о том, что делает upload_to< /а>   -  person Oluwafemi Sule    schedule 28.02.2018
comment
@OluwafemiSule Я изменил код. Теперь изображения загружаются в media/userimages, изображение есть, user.employee.avatar.url дает путь media/userimages/name.jpg, но изображение не отображается.   -  person Adrian    schedule 01.03.2018
comment
Что вы установили для MEDIA_ROOT в настройках Django?   -  person Oluwafemi Sule    schedule 02.03.2018
comment
@OluwafemiSule 'приложение/медиа/'   -  person Adrian    schedule 02.03.2018
comment
MEDIA_ROOT должно быть '/media', чтобы соответствовать user.employee.avatar.url   -  person Oluwafemi Sule    schedule 02.03.2018


Ответы (2)


Вы не должны использовать

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

сделать это. Это нормально только для целей отладки. В противном случае именно ваш nginx/apache/other_server должен нести ответственность за обслуживание статических файлов и медиафайлов, а также за маршрутизацию файла .sock, сгенерированного gunicorn/uwsgi.

person Maksym Shvernenko    schedule 03.12.2018

Наконец-то я понял, как заставить его работать, поэтому на случай, если у кого-то еще возникнет такая же проблема, я отвечу на свой вопрос. Просто добавьте это в settings.py

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

И это для urls.py:

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
person Adrian    schedule 02.03.2018