2017-02-27 72 views
1

在Django表單中,我讓用戶輸入他們的用戶名。本場是像這樣:操縱Django表單以顯示正確的驗證錯誤

username = forms.RegexField(max_length=50,regex=re.compile('^[\[email protected]+-]+$'),\ 
     error_messages={'invalid': _("(tip: only use alphabets, numbers or @ _ . + - symbols)")}) 

後來,在clean_username方法,我還需要確保用戶不包括在用戶名一whtiespace。我這樣做,像這樣:

def clean_username(self): 
    username = self.cleaned_data['username'] 
    if ' ' in username: 
     raise ValidationError("(tip: a username can't have whitespaces)") 
    return username 

的問題是,這個驗證錯誤從不出現,因爲空格失敗之前的正則表達式檢查。我需要能夠單獨顯示與空白相關的ValidationError。此外,如果用戶編寫正則表達式失敗的用戶名(例如Bèndèr*),我也不希望在顯示相關錯誤時妥協。

解決此問題的最佳方法是什麼?一個說明性的例子會很棒。謝謝!

回答

2

因此,而不是使用RegexField我可能要麼用CharField和定製clean - 方法的領域,它處理的空白問題,第一個也是唯一檢查正則表達式,如果空白檢查通過去。

或者我會用一個CharField和分配custom validator首先,檢查的空格,另外一個RegexValidator

東西沿着這些路線:

from django.core.exceptions import ValidationError 
from django.core.validators import RegexValidator 

def validate_whitespaces(value): 
    if ' ' in value: 
     raise ValidationError("Oops, a whitespace error occured.") 

username = forms.CharField(
    max_length=50, 
    validators=[ 
     validate_whitespaces, 
     RegexValidator(
      regex='^[\[email protected]+-]+$', 
      message='Only use valid chars ...' 
     ) 
    ] 
) 
+0

感謝阿里。是的,我懷疑是這樣。但需要澄清一點:通過用'Ch​​arField'替換'RegexField',我會失去其他任何東西嗎?如同爲什麼存在'RegexField'事件,因爲regexvalidation可以很容易地在CharField中調用?我試圖在這裏格外小心,因爲這涉及到我的應用程序的認證流程 - 不想被任何無法預料的事情所困擾。然而,'RegexField'的官方文檔看起來非常溫和。 –

+0

您可以查看'RegexField'的來源:https://github.com/django/django/blob/master/django/forms/fields.py#L493 沒有比傳遞正則表達式更多的東西了,在字段中定義給驗證器。 – arie