2017-06-19 72 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")