50VAJJ
@50VAJJ

Почему когда в django admin в ImageField добавлю картинку то django admin создаёт новую и загружает её?

Почему когда в django admin в ImageField добавлю картинку то django admin создаёт новую и загружает её? Ещё даёт её какое-то странное название. Это нормально?
cb7d083f6e524fc197fcd4eb2e32a737.png
  • Вопрос задан
  • 531 просмотр
Решения вопроса 1
ri_gilfanov
@ri_gilfanov
Web- and desktop-developer
По мнению разработчиков Django -- нормально.

Если хочется изменить такое поведение по-быстрому:
from django.db import models
from django.db.models.signals import post_delete


def change_image(post_object):
    # функция удаления изображений при их замене на новые
    post_object = self
    try:
        pre_object = post_object.__class__.objects.get(id=post_object.id)
        if pre_object.image != post_object.image:
            pre_object.image.delete(save=False)
    except:
        pass


def delete_image(sender, **kwargs):
    # функция удаления изображений при удалении объектов
    try:
        object_ = kwargs.get('instance')
        storage, path = object_.image.storage, object_.image.path
        storage.delete(path)
    except:
        pass


class MyModel(models.Model):
    # наша модель с картинкой
    image = models.ImageField(
        upload_to='images/',
    )

    def save(self, *args, **kwargs):
        # вызов change_image при сохранении объекта модели
        change_image(post_object=self)
        super(Category, self).save(*args, **kwargs)


# прикрепляем функцию delete_image к сигналу post_delete от модели MyModel
post_delete.connect(receiver=delete_image, sender=MyModel)


Думал доработать данный костыль в инвалидную коляску, а именно -- так чтобы название поля модели не имело значения. Например, при изменении и удалении объекта, через цикл прогонять все поля модели, чтобы применять проверки и операции ко всем FileField и ImageField в модели.

По-хорошему же, лучше разобраться с файловыми полями моделей и сделать своё кастомное. Рассматриваемая задача конечно мелочь, но опыт может пригодится.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
Вполне, ImageField для того и создан.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы