2009-07-16 11 views
1

J'ai un formulaire 'dans la nature' qui prend beaucoup de variables différentes - qui peuvent ou non être remplies.Meilleure façon de gérer les variables de requête dans Django

try: 
     app_version = request.REQUEST["appVersion"] 
    except: 
     app_version = '' 

    try: 
     app_name = request.REQUEST["appName"] 
    except: 
     app_name = '' 

    try: 
     app_code_name = request.REQUEST["appCodeName"] 
    except: 
     app_code_name = '' 

Existe-t-il un moyen plus efficace d'y parvenir?

Répondre

8

Si ces variables sont destinées à remplir un formulaire, vous pouvez transmettre l'objet request.POST directement au constructeur du formulaire.

if request.method == 'POST': 
    form = MyForm(request.POST) 

La forme passera automatiquement les valeurs correctes aux champs de formulaire correct et utiliser les valeurs par défaut pour les clés qui n'existent pas et va encore créer des champs vides pour les clés manquantes (voir supplément).

Si vous essayez de traiter un formulaire, il est toujours préférable de créer un objet de formulaire comme ci-dessus et de lire les valeurs de cet objet. N'oubliez pas que le code de validation est également mieux placé dans la classe de formulaire. De cette façon, si form.is_valid() renvoie True, vous savez que vous disposez d'un jeu de données propre à utiliser.

Remarque: Les documentations Django recommandent d'utiliser request.POST ou request.GET directement plutôt que la variable fusionnée request.REQUEST, car elle est plus explicite.

Addendum:

Il est important de comprendre la différence entre les formes liées et non liées dans ce cas. Si vous créez un formulaire non lié avec form = MyForm(), lorsque le formulaire est instancié, il remplira tous les champs avec la propriété initial de chaque champ (s'il existe). Par exemple, avec ce code:

from django import forms 

class MyForm(forms.Form): 
    appVersion = forms.CharField(initial='1.0') 
    appName = forms.CharField() 
    appCodeName = forms.CharField() 

la forme sera initialisée avec appVersion ayant une valeur de '1.0'. Toutefois, si vous liez une requête POST à ​​un formulaire comme celui-ci: form = MyForm(request.POST), les propriétés initiales sont ignorées. Cela signifie que si la commande POST n'inclut pas de clé appVersion, ce champ sera laissé vide. Tant que le champ n'est pas requis, votre formulaire sera toujours validé et vous pourrez modifier form.appVersion dans la vue après validation.

+1

et GET demande peut être validée automatiquement avec url regexes – Evgeny

+0

Je n'étais pas au courant de cela, merci! – sixthgear

+0

Bonne réponse. BTW, je vais utiliser réellement POST, pas de demande, je viens de passer en mode test et je trouve qu'il est plus facile d'envoyer des cas de test avec GET. –

11
app_version = request.REQUEST.get("appVersion", "") 

get(key, default) est un procédé mis en oeuvre sur python dicts. Si la clé existe dans le dictionnaire, sa valeur est renvoyée; Si la clé n'existe pas, la valeur par défaut spécifiée est renvoyée. Dans Django, request les objets sont des objets de type dictionnaire, donc get est également défini pour eux de la même manière.

+0

C'est certainement la réponse la plus Pythonic. J'étais sur le point de le marquer comme «la» réponse, mais je me suis rendu compte que la réponse ci-dessous tire pleinement parti de la définition de mon modèle, qui est même meilleure que ce que j'avais imaginé. –

6

Si vous avez de nombreux domaines, une version plus compacte pourrait être:

defaults = { 'field1' : 'val1', 'field2' : 'val2', ...} 
defaults.update(request.POST) 
+0

doit faire attention car il va modifier le dictionnaire POST. – Evgeny

+2

Il ne modifiera pas le dictionnaire POST, il va modifier le dictionnaire "par défaut". Vous passez ensuite le dictionnaire par défaut au formulaire au lieu du dictionnaire POST. – oggy

Questions connexes