2011-05-31 102 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

相關問題