Я сделал бы выбор на основе следующих критериев
Чтобы изменить содержимое поля файла, вы должны передать экземпляр объекта File
django в FileField.save()
. Он немного отличается от других типов полей модели.
FieldFile.save (name, content, save = True)
Этот метод принимает имя файла и содержимое файла и передает их классу хранения для поля, а затем ассоциирует сохраненный файл с полем модели. Если вы хотите вручную связать данные файла с экземплярами FileField в своей модели, метод save () используется для сохранения данных файла.
blockquote>from PIL import Image from django.core.files.base import ContentFile if instance.image: im = Image.open(instance.image) im.thumbnail((220, 130), Image.ANTIALIAS) thumb_io = BytesIO() im.save(thumb_io, im.format, quality=60) instance.image.save(im.filename, ContentFile(thumb_io.get_value()), save=False) instance.save()
Но если вы не используете удаленный файловой системы, вы можете просто перезаписать сам файл. Файл был создан при вызове
form.save()
. Поскольку вы используете одно и то же имя файла и местоположение, вам действительно не нужно прикасаться к модели или сообщать django, что вы возитесь с самим файлом.if instance.image: im = Image.open(instance.image) im.thumbnail((220, 130), Image.ANTIALIAS) im.save(im.filename, quality=60)
instance.image.save
.PIL.Image.save
будет сохраняться только в локальной файловой системе. Он не знает о резервных копиях django. – Håken Lid 15 March 2018 в 13:53thumb.save(thumb_io, im.format, quality=60)
возвращаетAttributeError: 'NoneType' object has no attribute 'save'
- когда я печатаюthumb
, он печатаетNone
- любую идею? – Zorgan 15 March 2018 в 22:56None
. Теперь я исправил код в своем ответе. – Håken Lid 15 March 2018 в 23:17