如果選中複選框,我正在使用自定義驗證器來檢查字段不爲空。它檢查正確,但無論它總是仍然驗證如果該值是一個數字。wtforms自定義驗證器可以使字段可選?
基本上我需要一個字段來停止表單的某些條件下的驗證。
有沒有一種方法讓自定義驗證器停止驗證字段?
如果選中複選框,我正在使用自定義驗證器來檢查字段不爲空。它檢查正確,但無論它總是仍然驗證如果該值是一個數字。wtforms自定義驗證器可以使字段可選?
基本上我需要一個字段來停止表單的某些條件下的驗證。
有沒有一種方法讓自定義驗證器停止驗證字段?
是的,自定義驗證器可以像內置的可選和必需驗證器一樣控制驗證流程。要控制驗證流程,請使用StopValidation
例外,並且不會再進行驗證。
如果通過消息引發StopValidation,它將被添加到錯誤列表中,否則如果沒有消息,則不會添加更多錯誤。
如果您使用的是IntegerField,FloatField等。您還必須記住輸入強制時發生的「處理錯誤」。可選驗證程序處理這種情況的方式是,如果輸入爲空,它將清除所有以前的錯誤。讓我們只需要快速瀏覽一下代碼從wtforms可選識別/ fields.py:
if not field.raw_data or isinstance(field.raw_data[0], basestring) and not field.raw_data[0].strip():
field.errors[:] = []
raise StopValidation()
正如你可以看到它做的事情之一,如果沒有輸入或輸入空,是它會清除排除任何以前的錯誤。
因此,讓我們來看看你如何做你的自定義驗證器。
from wtforms.validators import StopValidation
def myvalidator(form, field):
if not form.some_checkbox_field.data:
# clear out processing errors
field.errors[:] = []
# Stop further validators running
raise StopValidation()
然後,您可以使用您的驗證像這樣:
from wtforms import BooleanField, IntegerField, Form, validators as v
class SomeForm(Form):
some_checkbox_field = BooleanField('Enable MyNumber')
mynumber = IntegerField('', [myvalidator, v.NumberRange(min=5, max=50)])
那麼,如果複選框被選中,將驗證mynumber的是一個數字作爲輸入。另外,NumberRange驗證器將被運行。如果未選中,錯誤將被清除,並且StopValidation將阻止NumberRange運行。
[自定義驗證器的文檔](http://wtforms.readthedocs.io/en/latest/validators.html#custom-validators)以供參考。 – JaySeeAre
[如何在WTForms中有條件地選擇字段?](http://stackoverflow.com/questions/8463209/how-to-make-a-field-conditionally-optional-in-wtforms) – nsfyn55