2012-02-16 3 views
0

Bien que ce soit lié à django, c'est vraiment juste une question générale, l'efficacité de la programmation.Gère la variable qui pourrait être Aucune

J'ai un modèle qui, selon le scénario, obtiendra et retournera une ou deux formes. Si elle renvoie un formulaire, la variable qui contient le second formulaire sera None.

Je dois vérifier si les formulaires sont valides. Similaire à an example I read online, je vérifie .is_valid() sur les deux formes dans la même instruction if. Mais ceci sans surprise déclenche une erreur (l'objet NoneType n'a pas d'attribut is_valid) si le second formulaire est None. Quel est le meilleur moyen de vérifier que les deux formulaires sont valides sans encourir une erreur si le second formulaire est None?

if request.method == 'POST': 

    form = form_dict[modelname][1](request.POST) 
    try: 
     form_two = form_dict[modelname][2](request.POST) 
    except: 
     form_two = None 

    if form.is_valid() and form_two.is_valid(): 
     # Do some stuff and save the data from the form(s)  
    else: 
     try: 
      form = form_dict[modelname][1]() 
      form_two = form_dict[modelname][2]() 
     except: 
      form_two = None 
+0

Ne pouvez-vous pas vérifier avec une instruction IF si form_two est None et si ce n'est pas le cas, le valider? – sqram

+0

Est-ce une solution efficace? Il semble que je devrais écrire cette instruction if, puis encapsuler l'instruction if pour la validation du premier formulaire dans une instruction sub-if. –

+0

Que voulez-vous dire par efficace? Il est certainement efficace sur le plan informatique (vérifier si un objet est None est l'une des choses les plus rapides que vous puissiez faire). Et vous n'avez pas besoin de l'enfermer dans un sous-si-voir @ réponse de BrendanLong –

Répondre

4

Dans le cas général de vérifier si quelque chose est None .. il suffit de vérifier?

if x is not None and x.is_valid(): 
    ... 

En Python, or et and les deux short circuit, ce qui signifie que dans l'expression x and y, y n'est pas évalué si x est false (puisque l'expression est fausse, peu importe ce que y est).

+0

Je devrais avoir clarifié. J'ai besoin des deux formes si form_two n'est pas None. Donc, le premier bit de code ne fonctionne pas pour cet exemple. En ce qui concerne la vérification de la variable, j'ai besoin de vérifier la validité des deux formulaires s'ils existent. Il semble que votre deuxième bit de code ne vérifie que le premier formulaire? –

+0

@Ed. - Le deuxième bit est à usage général. Il suffit de l'étendre à autant de variables que nécessaire. La version simple est "vérifiez si c'est' None', puis vérifiez si elle est valide ", et faites cela pour chaque variable que vous devez vérifier. –

+0

@BrendanLong a exactement raison. Faites ceci comme 'si form_two n'est pas None et form.is_valid() et form_two.is_valid():' –

Questions connexes