Переопределение метода сохранения Django ModelForm и удаление старых значений (файлов)

У меня есть модель и ModelForm из упомянутой модели. Модель имеет поле изображения среди прочих. Когда я обновляю экземпляр модели с помощью ModelForm, если поле изображения было обновлено, я хочу, чтобы старый файл был удален. Поэтому я переопределяю метод save на ModelForm. Однако я получаю неожиданный результат.

При обновлении поля изображения, если ранее был NO файл, новый файл сохраняется отлично. Но если ранее был WAS файл, он сохраняется в файловой системе, но не сохраняется в экземпляре. Таким образом, поле изображения становится пустым.

Пример модели

class Article(models.Model):
    title = models.CharField(max_length=200)
    cover_image = model.ImageField()

Форма

from django.core.files.uploadedfile import InMemoryUploadedFile
from django.db.models.fields.files import ImageFieldFile, FileField


class ArticleModelForm(forms.ModelForm):

    class Meta:
        model = Article
        fields = '__all__'

    def save(self, commit=True):
        object = super().save(commit)

        # Clean out the old files
        for key in self.changed_data:
            new_value = self.cleaned_data.get(key)

            if new_value and isinstance(new_value, InMemoryUploadedFile):
                old_value = self.initial.get(key)

                if old_value and (isinstance(old_value, FileField) or isinstance(old_value, ImageFieldFile)):
                    old_value.delete()

        return object

В переопределенном методе сохранения то, что я сделал, это просмотреть все измененные данные и сделать следующее;

  1. Get the new value for the field.
  2. If the new value is an instance of InMemoryUploadedFile, retrieve it's previous value from self.initial which is the old value.
  3. If the old value is an instance of FileField or ImageFieldFile, it gets DELETED.

Новое значение каким-то образом теряется в этом процессе.

Может ли кто-нибудь объяснить поведение файла, который не сохраняется в экземпляре.

Django версии 2.1.5
Commit всегда True

Попробуйте использовать это, оно отлично работает в плане автоматического удаления старых файлов и фотографий. https://pypi.org/project/django-cleanup/

Вернуться на верх