2017-06-19 74 views
0

我看到很多关于django验证器没有给出正确响应的问题,但我有一个不同的问题。尽管从Django文档示例复制,我甚至不会触发。下面是我有:Django表单验证没有被触发

models.py

def content_file_name(instance, filename): 
    ext = ''.join(filename.split())[:-4] 
    foldername = "%s/%s" % (uuid.uuid4(), ext) 
    return '/'.join(['documents', str(foldername), filename]) 

class Document(models.Model): 
    docfile = models.ImageField(upload_to=content_file_name) 

class DocumentImage(models.Model): 
    imagefile = models.ImageField(upload_to=content_file_name) 
    image = models.ForeignKey(Document, related_name='Image', null=True, on_delete=models.CASCADE) 

views.py

def documentlist(request): 
    # Handle file upload 
    if request.method == 'POST': 
     form = DocumentForm(request.POST, request.FILES) 
     if form.is_valid(): 
      newdoc = form.save() 
      newdoc.create_documentfiles() 
      messages.add_message(request, messages.INFO, "Saved") 
      return HttpResponseRedirect(reverse('list')) 
    else: 
     form = DocumentForm() # A empty, unbound form 

    # Load documents for the list page 
    documents = Document.objects.all() 

    # Render list page with the documents and the form 
    return render(
     request, 
     'list.html', 
     {'documents': documents, 'form': form} 
    ) 

forms.py

class DocumentForm(forms.ModelForm): 

    class Meta: 
     model = Document 
     fields = ('docfile',) 

    def clean_image(self): 
     file = self.cleaned_data.get('docfile') 
     if file: 
      if imghdr.what(file.read()) != "gif": 
       raise forms.ValidationError("Please upload a .gif file") 
       print('complete'); 
      file.seek(0) 
     return file 

我甚至尝试设置forms.py这样的:

def clean_image(self): 
    print('test') 
    raise forms.ValidationError("Please upload a .gif file") 

我仍然得到既不ValidationError也不test打印控制台。有没有人遇到过这样的问题?

回答

2

你的验证函数的名称为clean_image,但对形式

fields = ('docfile',) 

没有image字段,以便它不会被调用。其中<fieldname>替换表单字段属性的名称 - 如果你想验证docfile

clean_<fieldname>()方法被调用的形式继承它应该被称为clean_docfile。此方法执行特定于该特定属性的任何清理,与它所在的字段类型无关。此方法未传递任何参数。您需要查看self.cleaned_data中的字段值,并记住它在此处将是一个Python对象,而不是表单中提交的原始字符串(它将在clean_data中,因为通用字段clean()方法,以上,已经清理过一次数据)。

https://docs.djangoproject.com/en/1.11/ref/forms/validation/

+0

哦,不知道他们有相关性。非常感谢! –

1

你的清洁方法名应该改名为

def clean_docfile(self): 
    print('test') 
    raise forms.ValidationError("Please upload a .gif file")