2013-04-24 72 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