web-dev-qa-db-fra.com

Comment gérer request.GET avec plusieurs variables pour le même paramètre dans Django

Dans une vue Django vous pouvez accéder à la request.GET['variablename'], à votre avis, vous pouvez faire quelque chose comme ceci:

myvar = request.GET['myvar']

L'actuel request.GET['myvar'] le type d'objet est:

<class 'Django.http.QueryDict'>

Maintenant, si vous voulez passer plusieurs variables avec le même nom de paramètre, c'est-à-dire:

http://example.com/blah/?myvar=123&myvar=567

Vous voudriez un python list retourné pour le paramètre myvar, puis faites quelque chose comme ceci:

for var in request.GET['myvar']:
    print(var)

Cependant, lorsque vous essayez de n'obtenir que la dernière valeur passée dans l'url, c'est-à-dire que dans l'exemple ci-dessus, vous obtiendrez 567, et le résultat dans le shell sera:

5
6
7

Cependant, lorsque vous effectuez une impression de request.GET il semble qu'il ait un list c'est-à-dire:

<QueryDict: {u'myvar': [u'123', u'567']}>

Ok Update: il est conçu pour renvoyer la dernière valeur, mon cas d'utilisation est que j'ai besoin d'une liste.

de Django docs:

QueryDict .getitem (clé) Renvoie la valeur de la clé donnée. Si la clé a plusieurs valeurs, getitem () renvoie la dernière valeur. Déclenche Django.utils.datastructures.MultiValueDictKeyError si la clé n'existe pas. (Il s'agit d'une sous-classe de KeyError standard de Python, vous pouvez donc vous en tenir à la capture de KeyError

QueryDict.getlist (key) Renvoie les données avec la clé demandée, sous la forme d'une liste Python. Renvoie une liste vide si la clé n'existe pas. Il est garanti de renvoyer une liste quelconque.

Mise à jour: Si quelqu'un sait pourquoi Django l'ont fait, faites-le moi savoir, cela semble contre-intuitif d'afficher une liste et elle ne se comporte pas comme telle. Pas très Pythonic!

66
ismail

Vous voulez la fonction getlist () de l'objet GET:

request.GET.getlist('myvar')
153
AndrewF

Une autre solution consiste à créer une copie de l'objet de requête ... Normalement, vous ne pouvez pas parcourir un objet request.GET ou request.POST, mais vous pouvez effectuer de telles opérations sur la copie:

res_set = request.GET.copy()
for item in res_set['myvar']:
    item
...
0
FallenAngel