Переопределение метода сохранения 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
В переопределенном методе сохранения то, что я сделал, это просмотреть все измененные данные и сделать следующее;
- Get the new value for the field.
- If the new value is an instance of
InMemoryUploadedFile
, retrieve it's previous value fromself.initial
which is the old value. - If the old value is an instance of
FileField
orImageFieldFile
, it gets DELETED.
Новое значение каким-то образом теряется в этом процессе.
Может ли кто-нибудь объяснить поведение файла, который не сохраняется в экземпляре.
Django версии 2.1.5
Commit всегда True
Попробуйте использовать это, оно отлично работает в плане автоматического удаления старых файлов и фотографий. https://pypi.org/project/django-cleanup/