Django - Изображение загружается после каждого сохранения()
I have a custom upload path for any users avatar. I call a function to set the upload path to "avatar/" + str(self.username) + "/" + filename
. My problem is everytime the user change e.g. email and save changes, the avatar gets saved again with the same upload path. models.py
def _upload_path(instance, filename):
return instance.get_upload_path(filename)
def reduce_image_size(avatar):
img = Image.open(avatar).convert('RGB')
thumb_io = BytesIO()
img.save(thumb_io, 'jpeg', quality=50)
new_image = File(thumb_io, name=avatar.name)
return new_image
class User(AbstractUser):
avatar = models.ImageField(upload_to=_upload_path, blank=True, null=True)
def get_upload_path(self, filename):
return "avatar/" + str(self.username) + "/" + filename
def save(self, *args, **kwargs):
new_image = reduce_image_size(self.avatar)
self.avatar = new_image
When first upload image the url is /media/avatar/username/the_uploaded_image.jpg and after updating any value it changes to /media/avatar/username/avatar/username/the_uploaded_image.jpg
Я пытался проверить, существует ли уже путь, но это не сработало.
if self.avatar and not os.path.exists(settings.MEDIA_URL + self.get_upload_path(self.avatar.name)):
new_image = reduce_image_size(self.avatar)
self.avatar = new_image
Я что-то упустил?
Обратите внимание, что функция save
срабатывает при каждом сохранении - как для нового, так и для старого пользователя.
Таким образом, reduce_image_size
срабатывает при каждом сохранении (независимо от того, новое оно или старое) - таким образом, изображение пересохраняется каждый раз.
Чтобы это происходило только для новых пользователей - просто добавьте следующее условие, чтобы проверить, работаете ли вы с существующим пользователем:
class User(AbstractUser):
def save(self, *args, **kwargs):
if not self.pk: # new user
new_image = reduce_image_size(self.avatar)
self.avatar = new_image
super().save(*args, **kwargs) # don't see this line in your code but I guess it's there...
Change
if self.avatar and not os.path.exists(settings.MEDIA_URL + self.get_upload_path(self.avatar.name)):
to
if not self.pk:
он проверяет, существует ли первичный ключ, и должен решить вашу проблему