Lors de la vérification de plusieurs formulaires avec is_valid, essayez d'abord de les affecter à des variables.

Aperçu

Par exemple, lorsque vous souhaitez vérifier si plusieurs formulaires sont correctement saisis dans django, pourquoi ne pas l'écrire simplement sous la forme suivante?


foo_form = HogeForm(request.POST, prefix="FooForm")
bar_form = FooForm(request.POST, prefix="BarForm")

if foo_form.is_valid() and bar_form.is_valid():
    #Traitement approprié
    pass
else:
    pass

Même avec cela, il est possible de récupérer l'erreur si l'une des formes est de la mousse pour le moment, mais le problème est si les deux formes sont de la mousse. À ce moment-là, ne supposez pas que is_valid () de bar_form est en cours d'exécution.

Pourquoi?

Pour faire simple, dans le cas de Python, dans le cas de la formule de jugement reliée par et, l'évaluation n'est pas exécutée après le premier False. Écrivons un code simple.

# -*- coding: utf-8 -*-


def return_True():
    print "Call: return_True"
    return True


def return_False():
    print "Call: return_False"
    return False


if return_True() and return_True() and return_False() and return_True():
    print "All True ?"
else:
    print "Not all True."

Dans ce cas, "Call: return_True" était affiché deux fois et "Call: return_False" était affiché une seule fois. L'exécution de la dernière fonction a été ignorée. C'est parce que * et une fois que False apparaît, le tout devient False *. Donc, pour omettre des ressources, ce sera comme "Alors, c'est faux" sans vérifier d'autres choses. (De même, une fois que True apparaît pour ou, le jugement suivant est ignoré.)

que vas-tu faire?

Le plus simple est de préparer une variable. Par exemple?

# -*- coding: utf-8 -*-


def return_True():
    print "Call: return_True"
    return True


def return_False():
    print "Call: return_False"
    return False

one_return_True = return_True()
two_return_True = return_True()
three_return_False = return_False()
forth_return_True = return_True()

if (one_return_True and
        two_return_True and
        three_return_False and
        forth_return_True):
    print "All True ?"
else:
    print "Not all True."

De cette façon, "return_True" sera également affiché trois fois.

Résumé

En premier lieu, lorsque le comportement est entrelacé avec d'autres méthodes en partant du principe qu'une méthode est appelée, ou lors de l'utilisation d'une méthode qui retourne Boolean après le traitement avec la méthode avec if etc., comme ci-dessus, La méthode que vous pensez "devrait être en cours d'exécution!" N'est pas en cours d'exécution.

Recommended Posts

Lors de la vérification de plusieurs formulaires avec is_valid, essayez d'abord de les affecter à des variables.
Premier YDK à essayer avec Cisco IOS-XE
Quand j'essaye de pousser avec heroku, ça ne marche pas