2016-06-29 7 views
5

Я использую wtforms для обработки данных из моих почтовых запросов. Одни определенные запросы на отправку отправляют множество данных, включая логическое значение.WTForms BooleanField обрабатывает ложное значение JSON как true

Моя форма выглядит следующим образом:

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?

У меня есть другая форма с булевым полем, которая обрабатывает ложные логические значения из моей базы данных postgres просто отлично.

ответ

8

WTForms на самом деле не предназначен для работы с данными JSON. В этом случае BooleanField проверяет, что полученное значение находится в field.false_values, который по умолчанию равен ('false', ''). Объект False там не там, поэтому считается, что это правда.

Проходит мимо другого набора false_values.

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

Или исправьте его для всех экземпляров, поставив его где-нибудь перед тем, как поле будет использоваться в первый раз.

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

Вы можете лучше использовать библиотеку сериализации, такие как Marshmallow для обработки данных в формате JSON.