Не работает дефолтная картинка в модели Django
Всем привет!
На моем сайте, основанном на Python Django, есть страница с профилем пользователя в которой отображается информация и его картинка профиля.
Модель пользователя:
from django.contrib.auth.models import User
from django.conf import settings
from django.db import models
class Profile(models.Model):
user = models.OneToOneField(User, on_delete = models.CASCADE)
profilePicture = models.ImageField( upload_to = "profile_pictures/%Y-%m-%d", default = 'default.png')
testInt = models.IntegerField(default = 10)
def __str__(self):
return 'Profile for user {}'.format(self.user.username)
До того как пользователь загрузил свою аватарку, используется дефолтная, расположенная в /media/default.png, однако при регистрации пользователя с последующим заходом в профиль картинки нет.
+ в admin ее тоже нет (c отображением картинок все в порядке):
TestInt использовал чтобы проверить, работает ли default в целом
Еще следует обратить внимание на то, что регистрация происходит через django auth user model, а Profile - OneToOneField
В прошлой версии сайта, где вся информация о пользователе была в модели Profile (без использования OneToOneField с Django User все работало хорошо)
Я новичек в Django, поэтому извиняюсь за странные вопросы.
Ответы (1 шт):
Никогда не нужно было такое поведение. Мне важно видеть что изображения нет. Да и расположение файла по умолчанию в media выглядит не совсем хорошо. media - это папка, в которую загружают файлы, на не помещают в ручную. Если вы соберетесь переносить/создать другой сайт основнный на этом коде, то он должен работать и без папки /media.
Типичным решением является проверка. что if profile.profilePicture: или ....filter(profilePricture__isnull=False)
А подмену изображения выводите в шаблоне.
{% if user.profile.profilePicture %}
<img src="{{ user.profile.profilePicture.url }}">
{% else %}
<img src="{% static 'default.png' %}">
{% endif %}
А еще можете написать метод, который будет возвращать url файла, а также проверять его наличие в файловой системе, так как Django не знает о том что файл исчез, пока он не понадобится. Ну это на будущее
