2013-04-24 73 views
1

我想通過實現文件大小限制和文件擴展名來驗證上傳的圖像。 問題是當一個圖像上傳,我要驗證的文件大小限制,文件擴展名被之前的過程,但我得到這個錯誤Django驗證錯誤

「member_descriptor」對象是unsubscriptable

forms.py" in clean_image 
    43.       if not file.name[-3:].lower() in ['jpg']: 

Exception Type: TypeError at /pro/ 
Exception Value: 'member_descriptor' object is unsubscriptable 
File "C:\Python26\lib\site-packages\django\forms\forms.py" in _get_errors 
    115.    self.full_clean() 
File "C:\Python26\lib\site-packages\django\forms\forms.py" in full_clean 
    270.   self._clean_fields() 

我Forms.py

class PersonForm(forms.ModelForm): 

    def clean_image(self): 
      cleaned_data = super(PersonForm,self).clean() 
      image = cleaned_data.get("image") 

      if image: 
        if image._size > 4*1024*1024: 
          raise forms.ValidationError("Image Must be <4mb Less") 
        if not file.name[-3:].lower() in ['jpg']: 
          raise forms.ValidationError("Your file extension was not recongized") 
        return image 



class Meta: 
    model = Person 
    fields = ('image',) 

views.py

def pro(request): 

    form = PersonForm() 
    if request.POST.has_key('pro'): 
     form = PersonForm(request.POST,request.FILES) 
     if request.POST['pro'] == 'first': 
      if form.is_valid(): 
       person = Person.objects.get(user=request.user) 
       image = form.cleaned_data['image'] 

       if image: 
        person.image = form.cleaned_data['image'] 
       person.save() 

    return render(request,'profile.html',{'form':form}) 

我的models.py

class Person(models.Model): 
    user = models.ForeignKey(User) 
    image = models.FileField(upload_to="images/",blank=True) 
    def __unicode__(self): 
     return self.name 

回答

4

在該行地方拋出異常,您嘗試訪問file.namefile是Python中的一種內置類型。這就是你在那裏訪問。你應該嘗試類似if not image.file.name[-3:].lower() in ['jpg']:

+0

因爲你有'def check_extension(file):if ['jpg']中的file.name [-3:]。lower():return True else:return False' ,這不是這種情況。 – 2013-04-24 15:13:34

+1

@PauloBu我簡單地使用'image.file.name.endswith('jpg')'就像[PEP-8推薦](http://www.python.org/dev/peps/pep-0008/#programming推薦)或者創建一個像@BurhanKhalid建議的函數 – 2013-04-24 15:20:40

+0

當然,我只是指出他所指的'file'不是真正的字段。 – 2013-04-24 15:28:21