2015-01-31 4 views
1

Я хочу подтвердить свою форму, где пользователь не может загрузить изображение размером более 512 Kb ... Моя проверка достоверна, если размер файла больше 512 Кб, но когда Я не загружать ничего, что дает ошибку говоря unicode object has no attribute size, но я проверил, что изображение должно быть истиннымОбъект django 'unicode' не имеет атрибута 'size'

class GeneralUserPictureChangeForm(forms.ModelForm): 
class Meta: 
    model = GeneralUser 
    fields = ("thumbnail",) 

def clean_thumbnail(self): 
    thumbnail = self.cleaned_data['thumbnail'] 
    if thumbnail: 
     if thumbnail.size > 512*1024: 
      raise forms.ValidationError("Image file too large (> 512Kb)") 
     return thumbnail 

    else: 
     raise forms.ValidationError("Couldn't read uploaded image") 

Вот если я не загружать ничего он должен дать сообщение об ошибке «не удалось прочитать загруженное изображение», но он дает ошибку ..

Что здесь не так?

ответ

0

Вам нужно будет сделать больше, чем просто проверить поле изображения нас в очищенных данных. Я подозреваю, что вы можете что-то сделать;

if thumbnail is not None: 
    try: 
     if thumbnail.size > 512*1024: 
      raise forms.ValidationError("Image file too large (> 512Kb)") 
    except AttributeError: 
     # no image uploaded as it has no size 
     self._errors['thumbnail'] = _("Please upload an image") 
return thumbnail 
1

В том случае, когда кто-то загружает недопустимое изображение, необходимо проверить наличие AttributeException, однако вы не возвращаете очищенное значение данных, даже если это None. Если вы не вернете значение за пределами условного оператора (-ов), ваша форма будет никогда не будет.

Используйте статический метод .get(), присутствующий во всех словарях Python, чтобы получить значение thumbnail. Если ключа нет, возвращаемое значение будет None. Проверка ключа в словаре, который не существует, приведет к возникновению исключения KeyError.

def clean_thumbnail(self): 

    # .get() will return `None` if the key is missing 
    thumbnail = self.cleaned_data.get('thumbnail') 

    if thumbnail: 
     try: 
      if thumbnail.size > 512*1024: 
       raise forms.ValidationError(
        "Image file too large (> 512Kb)") 
     except AttributeError: 
      raise forms.ValidationError("Couldn't read uploaded image") 

    # always return the cleaned data value, even if it's `None` 
    return thumbnail 
Смежные вопросы