2012-09-05 118 views
0

由於內置驗證器在Django接受哪怕只是空間被輸入到一個字段包含驗證。我想要一個驗證,如果只有空格被填充,那麼它必須引發驗證錯誤。我有這樣的領域:在清潔領域-Django

name = forms.CharField(max_length=200) 

在外面使用驗證器即編寫這樣的功能。

def validate_spaces(value): 
    if value.strip() == '': 
    raise ValidationError(u"You must provide more than just whitespace.") 

但是,我)想,如果它可以使用form.clean來完成(方法,即不受外界編寫任何額外的功能。任何幫助都感激不盡。

回答

2

您可以添加自定義行爲form.clean()是這樣的:

class YourForm(forms.Form): 
    # Everything as before. 
    ... 

    def clean_name(self): 
     data = self.cleaned_data['name'] 
     if data.strip() == '': 
      raise forms.ValidationError(u"You must provide more than just whitespace.") 

     # Always return the cleaned data, whether you have changed it or 
     # not. 
     return data 

但是,如果你想創建一個類型字段的自動獲取這種類型的驗證,添加一個新的類象這

class NoSpacesCharField(forms.CharField): 
    def validate(self, value): 
     # Use the parent's handling of required fields, etc. 
     super(NoSpacesCharField, self).validate(value) 

     if value.strip() == '': 
      raise ValidationError(u"You must provide more than just whitespace.") 

然後使用NoSpacesCharField就像你通常使用forms.CharField。

我不是目前的位置來測試這個代碼,所以有可能是在它的奇扭結,但它應該讓你大部分的方式存在。有關在Django的表單驗證進一步信息見https://docs.djangoproject.com/en/dev/ref/forms/validation/

+0

Thanks..The第一個解決方案爲我工作很好。現在,如果我不得不延長爲更多的領域做我不得不重複自己驗證..或者是有一個簡單的方法周圍。 –

+1

如果你創建一個自定義字段類型,那麼你可以在任何需要這樣驗證的字段的地方使用它。這就是我的第二段代碼。 (我剛剛解決了超級通話中的錯誤)。這樣,你可以使用'名稱= NoSpacesCharField(MAX_LENGTH = 200)'和'anotherField = NoSpacesCharField(MAX_LENGTH = 100)'等,而無需重複驗證代碼。 –