Сброс поля Avatar ImageField по умолчанию, когда пользователь очищает аватар через DRF или Django Admin
У меня есть django модель ImageField под названием avatar. Я хочу, чтобы пользователь мог очистить свой аватар, поэтому Blank = True
. Проблема в том, что когда пользователь убирает свой аватар, путь к ImageField становится пустым. Я хочу вернуть ImageField к значению по умолчанию.
models.py
class Profile(models.Model):
AVATAR_UPLOAD_TO = "account_avatar/"
DEFAULT_AVATAR = "default.jpg"
user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
avatar = sorl.thumbnail.ImageField(upload_to=AVATAR_UPLOAD_TO, default=AVATAR_UPLOAD_TO+DEFAULT_AVATAR, blank=True, null=True)
Я вижу некоторые связанные вопросы Django ImageField перезаписывает существующий путь, если он пуст. Но это поведение не совсем то, что я хочу. Этот ответ требовал от пользователя загрузить новый аватар, поэтому пользователь не мог очистить свой аватар. Еще один смежный вопрос Django - Как вернуть поля модели к значению по умолчанию? . Но я не могу реализовать метод save()
на моих моделях
Я пытался реализовать метод save()
на модели Profile, но он не работает так, как ожидалось
def save(self, *args, **kwargs):
if not self.avatar.name:
setattr(self, 'avatar.name', self.avatar.field.default)
super().save(*args, **kwargs) # Call the "real" save() method.
Я новичок в Django и Django Rest Framework. Пожалуйста, помогите мне, я застрял с этой проблемой несколько дней назад. Не могли бы вы помочь с моей проблемой. Заранее спасибо!
Вы просто пропустили незначительный код вот как вы можете продолжить в save()
методе
class Profile(models.Model):
AVATAR_UPLOAD_TO = "account_avatar/"
DEFAULT_AVATAR = "default.jpg"
user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
avatar = sorl.thumbnail.ImageField(upload_to=AVATAR_UPLOAD_TO,
default=AVATAR_UPLOAD_TO+DEFAULT_AVATAR, blank=True, null=True)
def save(self, *args, **kwargs):
if not self.avatar:
self.avatar = self.AVATAR_UPLOAD_TO + self.DEFAULT_AVATAR
super(Profile,self).save(*args, **kwargs) # Call the "real" save() method.