2016-06-29 6 views
5

मैं अपने पोस्ट अनुरोधों से डेटा को संभालने के लिए wtforms का उपयोग कर रहा हूं। एक निश्चित पोस्ट अनुरोध एक बुलियन मूल्य सहित विभिन्न प्रकार के डेटा भेजता है।WTForms BooleanField JSON झूठी मान को सत्य के रूप में मानता है

मेरे प्रपत्र इस तरह दिखता है:

class EditFileForm(Form): 
    title = StringField('title') 
    shared = BooleanField('shared') 
    fileID = IntegerField('fileID') 
    userID = IntegerField('userID') 

मैं देख सकता हूँ कि जब मैं अनुरोध प्राप्त होता है डेटा इस तरह दिखता है:

data = MultiDict(mapping=request.json) 
print(data) 
>>MultiDict([(u'shared', False), (u'title', u'File5'), (u'userID', 1), (u'fileID', 16)]) 

आप देख सकते हैं बूलियन क्षेत्र "गलत" है, और कच्चे डेटा को प्रिंट करने से पता चलता है कि हालांकि, जब मैं वास्तविक फॉर्म फ़ील्ड प्रिंट करता हूं तो मुझे सच हो जाता है।

print(form.shared.raw_data) 
[False] 
print(form.shared.data) 
True 

मैंने पढ़ा WTForms कैसे झूठे बूलियन मूल्यों को संभालने के लिए पता नहीं हो सकता है कि। ऐसा करने का सही तरीका क्या है? इसके बजाय IntegerField का उपयोग करना?

मेरे पास एक बूलियनफील्ड वाला एक और रूप है जो मेरे पोस्टग्रेज़ डेटाबेस से झूठे बूलियन मानों को ठीक से संभाल रहा है।

उत्तर

8

WTForms वास्तव में जेएसओएन डेटा के साथ काम करने के लिए नहीं है। इस मामले में, BooleanField चेक करता है कि यह मान field.false_values में है, जो ('false', '') पर डिफ़ॉल्ट है। False ऑब्जेक्ट वहां नहीं है, इसलिए इसे सही माना जाता है।

आप फ़ील्ड में false_values का एक अलग सेट पास कर सकते हैं।

BooleanField(false_values={False, 'false', ''}) 

या इसे पहली बार क्षेत्र के पहले उपयोग करने से पहले इसे कहीं भी रखकर सभी उदाहरणों के लिए पैच करें।

BooleanField.false_values = {False, 'false', ''} 

आप JSON डेटा को संभालने के लिए एक क्रमबद्धता पुस्तकालय जैसे Marshmallow का उपयोग कर से बेहतर हो सकता है।

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