2011-12-09 23 views
8

Tôi đang sử dụng trình xác thực tùy chỉnh để chọn trường không trống nếu chọn hộp kiểm. Nó kiểm tra chính xác nhưng bất kể nó vẫn luôn xác thực nếu giá trị là một số.Có thể wtforms trình xác thực tùy chỉnh tạo một trường tùy chọn không?

Về cơ bản tôi cần một trường để dừng xác thực trong các điều kiện nhất định của biểu mẫu.

Có cách nào để trình xác thực tùy chỉnh ngừng xác thực trên trường không?

+0

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

Trả lời

12

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.

+0

[Tài liệu dành cho trình xác thực tùy chỉnh] (http://wtforms.readthedocs.io/en/latest/validators.html#custom-validators) để tham khảo. – JaySeeAre

Các vấn đề liên quan