2016-06-29 41 views
5

Sto utilizzando wtforms per gestire i dati dalle mie richieste di post. Una certa richiesta di posta invia una varietà di dati incluso un valore booleano.WTForms BooleanField considera il valore falso JSON come true

La mia forma è simile al seguente:

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

posso vedere che quando ricevo la richiesta dei dati è simile al seguente:

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

si può vedere il campo booleano è "false", e la stampa dei dati grezzi mostra anche quello. Tuttavia, quando stampo il campo del modulo reale, ottengo la verità.

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

ho letto che WTForms potrebbero non sapere come gestire falsi valori booleani. Qual è il modo corretto di farlo? Utilizzando invece un IntegerField?

Ho un altro modulo con un booleanfield che sta gestendo valori falso booleani dal mio database postgres bene.

risposta

8

WTForms non è pensato per funzionare con i dati JSON. In questo caso, BooleanField controlla che il valore ricevuto sia field.false_values, che per impostazione predefinita è ('false', ''). L'oggetto False non è lì, quindi è considerato vero.

È possibile passare un altro set di false_values sul campo.

Oppure patcharlo per tutte le istanze posizionandolo da qualche parte prima che il campo venga utilizzato per la prima volta.

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

Potrebbe essere meglio utilizzare una libreria di serializzazione come Marshmallow per gestire i dati JSON.