Проверка выдает ошибку на ImageField - PullRequest
1 голос
/ 31 мая 2011

У меня есть форма, где пользователь загружает аватар, и он изменяет размер фотографии и перезагружает страницу с новым аватаром.Форма работает отлично без какой-либо проверки.

Когда я добавляю проверку, чтобы вызвать ошибку, если изображение меньше определенного размера, forms.ValidationError работает нормально.Однако когда данные проходят проверку , это приводит к ошибке формы.

Вот то, что у меня сейчас есть -

def handle_uploaded_image(i):
   ### enter size of thumbnail, returns (filename, content)        

def getting_started_pic(request):
    form = ProfilePictureForm()
    username = request.session.get('username')
    profile = UserProfile.objects.get(user=username) 
    if request.method == 'POST':
        form = ProfilePictureForm(request.POST, request.FILES)
        if form.is_valid():
            form = ProfilePictureForm(request.POST, request.FILES, instance = profile)
            ob = form.save(commit=False)
            try:
                t = handle_uploaded_image(request.FILES['avatar'])
                ob.avatar.save(t[0],t[1])
            except KeyError:
                ob.save()
            return render_to_response (...)
    return render_to_response (...)

А в models.py -

class ProfilePictureForm(ModelForm):
    avatar = forms.ImageField()
    class Meta:
        model = UserProfile
        fields = ('avatar')

    def clean_avatar(self):
        import StringIO
        from PIL import Image, ImageOps        

        str=""
        for c in self.cleaned_data['avatar'].chunks():
            str += c

        imagefile = StringIO.StringIO(str)
        image = Image.open(imagefile)

        width, height = image.size[0], image.size[1]
        if width < 200 or height < 200:
            raise forms.ValidationError("Please upload an image at least 200 pixels wide.")
        else:
            return self.cleaned_data['avatar']

Так что, когда я использую эту проверку, и она возвращает cleaned_data выдает следующее сообщение об ошибке:

The UserProfile could not be changed because the data didn't validate.

Из трассировки выдается строка с ошибкой: ob = form.save(commit=False), поэтому она выглядит как ошибка проверки на уровне модели.Не могли бы вы сказать мне, почему эта ошибка происходит, и как я могу это исправить?Спасибо

1 Ответ

4 голосов
/ 31 мая 2011

Может быть так:

form = ProfilePictureForm(request.POST, request.FILES)
if form.is_valid():
    form = ProfilePictureForm(request.POST, request.FILES, instance = profile)
    ...

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

Попробуйте просто:

form = ProfilePictureForm(request.POST, request.FILES, instance = profile)
if form.is_valid():
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...