Проблемы возникают из-за сравнения активной загрузки изображения в форму и обновления формы, но не обновления изображения. В форме есть несколько атрибутов, одним из которых является изображение
Когда я загружаю изображение, отлично работает следующее:
file = self.cleaned_data.get('image', False)
if file.image:
image = file.image
if image.height > 1920 or image.width > 1080:
raise ValidationError("Height or Width is larger than what is allowed")
return file
else:
raise ValidationError("No image found")
Если я использую тот же код, но не использую загрузить изображение ...
Объект 'ImageFieldFile' не имеет атрибута 'image'
Похоже, когда я загружаю, он находит файл, а не изображение. И когда я не загружаю, он находит изображение, потому что, если я изменю его на:
image = self.cleaned_data.get('image', False)
if image:
if image.height > 1920 or image.width > 1080:
raise ValidationError("Height or Width is larger than what is allowed")
return image
else:
raise ValidationError("No image found")
, это позволит мне обновить форму, но не изображение.
Теперь, если я попробую тот же код при загрузке изображения, я получу: 'InMemoryUploadedFile' object has no attribute 'height'
Мои попытки исправить эту проблему:
Один:
if file:
try:
image = file.image
print(image.height) ---> prints [height]
if image.height > 1920 or image.width > 1080:
print("val", image.height) ---> prints val [height]
raise ValidationError("Height or Width is larger than what is allowed")
return file
except:
print("except", file) ---> prints except [file name]
return file
else:
raise ValidationError("No image found")
Кажется, это работает до момента проверки. Чтобы уточнить, я тестировал изображения размером 6000x6000 пикселей. Эти проверки работают с первым показанным кодом, но не с попыткой.
Два:
if file:
try:
image = file.image
if image.height > 1920 or image.width > 1080:
# print("val", image.height)
raise ValidationError("Height or Width is larger than what is allowed")
return file
except:
image = file
if image.height > 1920 or image.width > 1080:
# print("val", image.height)
raise ValidationError("Height or Width is larger than what is allowed")
return image
else:
raise ValidationError("No image found")
Эта попытка номер два почти работает, но не выполняет проверки. Он позволяет мне загружать файлы, размер которых меньше разрешенной высоты и ширины, а также позволяет обновлять форму без загрузки нового файла изображения. Но когда я загружаю изображение больше, чем высота и ширина, я получаю: 'TemporaryUploadedFile' object has no attribute 'height'
Цель состоит в том, чтобы просто гарантировать, что изображения соответствуют указанной c высоте и ширине, а также разрешить отправку формы, даже если изображение не обновлено.
Есть ли что-то, чего мне не хватает есть эта работа и как это может работать?
ОБНОВЛЕНИЕ:
Что работает:
Я заметил, что при обновлении формы я не передавал изображение данные выглядели так:
'image': ['']
После очистки изображение будет отображаться из ранее загруженного изображения в базе данных.
Затем я заметил, что когда изображение было загружено, данные не были есть поле изображения, но оно появится только после его очистки.
Итак, сделаем это:
data_file = self.data.get('image', False)
file = self.cleaned_data.get('image', False)
if data_file == False:
if file.image:
image = file.image
if image.height > 1920 or image.width > 1080:
raise ValidationError("Height or Width is larger than what is allowed")
return file
else:
raise ValidationError("No image found")
else:
return file
Позволяет мне проверить, было ли загружено новое изображение или нет, и если да, go через проверку, а если нет, вернуть существующий файл.
Хотя я признаю, это кажется не лучшим способом go об этом.
Если у кого-то есть предложения дайте мне знать