Делайте сохранение по умолчанию вместо переопределения - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть модель, которая выглядит следующим образом:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.CharField(max_length=160, null=True)
    avatar = models.ImageField(storage=OverwriteStorage(), upload_to=create_user_image_path,
                               validators=[validate_avatar],
                               default="default/avatars/default.jpg")
    def save(self, *args, **kwargs):
        super(Profile, self).save(*args, **kwargs)

        if self.avatar:
            image = Image.open(self.avatar.path)
            image_path = self.avatar.path
            image_name = self.avatar.path[:-4]
            image_ext = self.avatar.path[-4:]

            resize_images(image, image_path, image_name, image_ext)
            image.close()

Модель также имеет свой метод сохранения по умолчанию, переопределенный для создания некоторой логики c для загруженного изображения. Однако предположим, что пользователь зарегистрировался и не имеет изображения, поэтому вместо него используется изображение по умолчанию. Поэтому, когда это происходит Profile(user=22).save(), я не хочу использовать переопределенный метод сохранения, потому что вместо этого мы используем изображение по умолчанию, поэтому не требуется никаких дополнительных логик c. Есть ли способ, как я могу сохранить его в базе данных, а не через переопределенный метод сохранения?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

@ Роб Везина правильно ответил на вопрос.

Как говорится, идеальный способ сделать то, что вы действительно пытаетесь сделать, это оставить поле avatar пустым и показать значение по умолчанию. изображение в шаблонах, если профиль не загружен avatar.

<img src={{ user.profile.avatar.url|default:'/static/default_avatar.jpg' }} />
<!-- better if you have the URL of the default image stored as a constant in your code -->

или

class Profile(models.Model
    avatar = models.ImageField(
        storage=OverwriteStorage(), 
        upload_to=create_user_image_path,
        validators=[validate_avatar]
    )

    def image(self, *args, **kwargs):
        return self.avatar.url if self.avatar else '/static/default_avatar.jpg'  # Even better if you have this literal string as a constant in your settings 

<img src={{ user.image }} />

Преимущества этих решений:

  1. Вам не нужно изменять его в базе данных, если вы хотите изменить изображение по умолчанию
  2. Вы ведете запись профилей без загруженных аватаров
1 голос
/ 03 апреля 2020

Поскольку у вас есть значение по умолчанию, ваше условное if self.avatar всегда будет верным. Вам нужно проверить значение self.avatar, чтобы увидеть, является ли оно значением по умолчанию.

    def save(self, *args, **kwargs):
        super(Profile, self).save(*args, **kwargs)

        if self.avatar.name != Profile._meta.get_field('avatar').get_default():
            image = Image.open(self.avatar.path)
            image_path = self.avatar.path
            image_name = self.avatar.path[:-4]
            image_ext = self.avatar.path[-4:]

            resize_images(image, image_path, image_name, image_ext)
            image.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...