Có, trình xác thực tùy chỉnh có thể kiểm soát luồng xác thực giống như trình xác thực tùy chọn và được yêu cầu tích hợp sẵn. Để kiểm soát luồng xác thực, bạn sử dụng ngoại lệ StopValidation
và không thực hiện xác thực thêm nữa.
Nếu StopValidation được nâng lên với một tin nhắn, nó sẽ được thêm vào danh sách lỗi, nếu không nếu không có thông báo, sẽ không có thêm lỗi nào được thêm vào.
Nếu bạn đang sử dụng, giả sử, IntegerField, FloatField, vv .. bạn cũng phải ghi nhớ "lỗi xử lý" xảy ra ở thời gian ép buộc đầu vào. Cách trình kiểm tra Tùy chọn xử lý việc này là nó xóa tất cả các lỗi trước đó nếu đầu vào trống. Hãy chỉ có một cái nhìn nhanh chóng tại các mã cho các validator bắt buộc từ 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()
Như bạn có thể thấy một trong những điều nó nếu không có đầu vào hoặc đầu vào trống, là nó sẽ xóa ra bất kỳ lỗi nào trước đó.
Vì vậy, hãy tìm hiểu cách bạn có thể thực hiện trình xác thực tùy chỉnh của mình.
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()
Sau đó, bạn có thể sử dụng validator của bạn như ví dụ:
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)])
Vì vậy, sau đó, nếu hộp kiểm được chọn, nó sẽ xác nhận mynumber đó là một số như đầu vào. Ngoài ra, trình xác nhận NumberRange sẽ được chạy. Nếu không được chọn, các lỗi sẽ bị xóa và StopValidation sẽ ngăn không cho NumberRange chạy.
bản sao có thể có của [Cách tạo trường tùy chọn trong WTForms?] (Http://stackoverflow.com/questions/8463209/how-to-make-a-field-conditionally-optional-in-wtforms) – nsfyn55