Проверка размера изображения в django admin
Я вижу, что многие люди с приложениями Django, у которых есть загрузки изображений, автоматически изменяют размер изображений после их загрузки. Это хорошо и хорошо для некоторых случаев, но я не хочу этого делать. Вместо этого я просто хочу заставить пользователя загрузить файл, который уже имеет нужный размер.
Я хочу иметь ImageField, где я заставляю пользователя загружать изображение размером 100x200. Если изображение, которое они загружают, не соответствует этому размеру, я хочу, чтобы форма администратора возвращалась как недействительная. Я также хотел бы иметь возможность сделать то же самое для пропорций. Я хочу заставить пользователя загрузить изображение с 16: 9 и отклонить любую загрузку, которая не соответствует.
Я уже знаю, как получить ширину и высоту изображения, но я не могу сделать эту серверную сторону до тех пор, пока изображение уже не будет загружено, и форма будет отправлена успешно. Как я могу проверить это раньше, если это возможно?
Ответы
Ответ 1
Правильное место для этого - во время проверки формы.
Быстрый пример (отредактируйте/интегрируйте с дополнительной информацией позже):
from django.core.files.images import get_image_dimensions
from django.contrib import admin
from django import forms
class myForm(forms.ModelForm):
class Meta:
model = myModel
def clean_picture(self):
picture = self.cleaned_data.get("picture")
if not picture:
raise forms.ValidationError("No image!")
else:
w, h = get_image_dimensions(picture)
if w != 100:
raise forms.ValidationError("The image is %i pixel wide. It supposed to be 100px" % w)
if h != 200:
raise forms.ValidationError("The image is %i pixel high. It supposed to be 200px" % h)
return picture
class MyAdmin(admin.ModelAdmin):
form = myForm
admin.site.register(Example, MyAdmin)
Ответ 2
используйте эту функцию в файле модели,
from django.core.exceptions import ValidationError
def validate_image(fieldfile_obj):
filesize = fieldfile_obj.file.size
megabyte_limit = 2.0
if filesize > megabyte_limit*1024*1024:
raise ValidationError("Max file size is %sMB" % str(megabyte_limit))
class Company(models.Model):
logo = models.ImageField("Logo", upload_to=upload_logo_to,validators=[validate_image], blank=True, null=True,help_text='Maximum file size allowed is 2Mb')
Ответ 3
Это может быть обман/очень похожий на этот вопрос:
Использование jQuery, ограничение размера файла перед загрузкой
Я не думаю, что есть способ сделать это так, как вы хотите. Решение Agos - это путь...
Изменить: Один из ответов в связанном SO-вопросе говорит об использовании flash для этого. Поэтому, хотя это может быть связано с некоторыми другими технологиями, я не думаю, что вы можете сделать это с помощью прямого javascript.