2011-05-31 73 views
1

我有一个用户上传头像的表单,它调整了照片的大小并使用新的头像重新加载了页面。没有任何验证,表单可以很好地工作。验证在ImageField上抛出错误

当我添加一个验证来提出错误,如果图像低于一定的大小,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),所以它看起来像一个模型级验证错误。你能告诉我为什么会出现这个错误,以及我如何解决它?谢谢

回答

3

它可能是这样的:

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(): 
    ... 
+0

非常感谢你。这是我错误地做了一个很好的解释。但是有一个相关的问题,即使我仍然覆盖数据,为什么数据不通过验证就会被验证? – David542 2011-05-31 18:46:14