2011-12-09 16 views
8

यदि कोई चेक बॉक्स चेक किया गया है तो फ़ील्ड को चेक करने के लिए मैं एक कस्टम सत्यापनकर्ता का उपयोग नहीं कर रहा हूं। यह सही ढंग से जांचता है लेकिन यह मानता है कि यह मान हमेशा एक मान्य है या नहीं।कस्टम सत्यापनकर्ता wtforms एक फ़ील्ड वैकल्पिक बना सकते हैं?

मूल रूप से मुझे फ़ॉर्म की कुछ शर्तों के तहत सत्यापन रोकने के लिए एक फ़ील्ड चाहिए।

क्या कस्टम सत्यापनकर्ता के लिए फ़ील्ड पर सत्यापन रोकने का कोई तरीका है?

+0

संभावित डुप्लिकेट [WTForms में सशर्त रूप से वैकल्पिक क्षेत्र कैसे बनाएं?] (Http://stackoverflow.com/questions/8463209/how-to-make-a-field-condically-optional-in-wtforms) – nsfyn55

उत्तर

12

हां, कस्टम वैधक अंतर्निहित वैकल्पिक और आवश्यक सत्यापनकर्ताओं की तरह सत्यापन प्रवाह को नियंत्रित कर सकते हैं। सत्यापन प्रवाह को नियंत्रित करने के लिए, आप StopValidation अपवाद का उपयोग करते हैं, और कोई और सत्यापन नहीं किया जाएगा।

यदि किसी संदेश के साथ स्टॉप वैलिडेशन उठाया गया है, तो इसे त्रुटियों की सूची में जोड़ा जाएगा, अन्यथा यदि कोई संदेश नहीं है, तो कोई और त्रुटि नहीं जोड़ा जाएगा।

यदि आप इंटेगरफिल्ड, फ्लोटफिल्ड इत्यादि का उपयोग कर रहे हैं, तो आपको इनपुट प्रसंस्करण समय पर "प्रसंस्करण त्रुटियों" को ध्यान में रखना होगा। जिस तरह से वैकल्पिक सत्यापनकर्ता इसे संभालता है, यह इनपुट खाली होने पर सभी पिछली त्रुटियों को साफ़ करता है। चलो बस 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 एक संख्या के रूप inputted था। इसके अलावा, नंबररेंज सत्यापनकर्ता चलाया जाएगा। यदि चेक नहीं किया गया है, तो त्रुटियों को मंजूरी दे दी जाएगी, और StopValidation नंबररेंज को चलने से रोक देगा।

+0

[कस्टम सत्यापनकर्ताओं के लिए डॉक्स] (http://wtforms.readthedocs.io/en/latest/validators.html#custom-validators) संदर्भ के लिए। – JaySeeAre

संबंधित मुद्दे