Supposons que j'ai le QueryDict suivant:
<QueryDict: {u'num': [0], u'var1': [u'value1', u'value2'], u'var2': [u'8']}>
J'aimerais avoir un dictionnaire à partir de ceci, par exemple:
{'num': [0], 'var1':['value1', 'value2'], 'var2':['8']}
(Peu m'importe si le symbole Unicode u
reste ou disparaît.)
Si je le fais queryDict.dict()
, comme suggéré par le site django , je perds les valeurs supplémentaires appartenant à var1
, par exemple:
{'num': [0], 'var1':['value2'], 'var2':['8']}
Je pensais faire ceci:
myDict = {}
for key in queryDict.iterkeys():
myDict[key] = queryDict.getlist(key)
Y a-t-il un meilleur moyen?
dict(queryDict.lists())
semble fonctionnerdict(queryDict)
.Nouveau dans Django> = 1.4.
QueryDict.dict()
https://docs.djangoproject.com/en/stable/ref/request-response/#django.http.QueryDict.dict
la source
C'est ce que j'ai fini par utiliser:
D'après mon utilisation, cela semble vous donner une liste que vous pouvez renvoyer par exemple à un constructeur de formulaire.
EDIT: ce n'est peut-être pas la meilleure méthode. Il semble que si vous voulez par exemple écrire
QueryDict
dans un fichier pour une raison folle,QueryDict.urlencode()
c'est la voie à suivre. Pour reconstruire leQueryDict
vous faites simplementQueryDict(urlencoded_data)
.la source
la source
Si vous ne souhaitez pas que les valeurs sous forme de tableaux, vous pouvez effectuer les opérations suivantes:
zip est un outil puissant pour en savoir plus ici http://docs.python.org/2/library/functions.html#zip
la source
QueryDict.dict()
(c'est-à-direrequest.POST.dict()
) et cela renverra les valeurs correctement.J'ai rencontré un problème similaire, souhaitant enregistrer des valeurs arbitraires d'un formulaire en tant que valeurs sérialisées.
Ma réponse évite d'itérer explicitement le contenu du dictionnaire:
dict(querydict.iterlists())
Afin de récupérer une valeur de type dictionnaire qui fonctionne comme l'original, une fonction inverse utilise
QueryDict.setlist()
pour remplir une nouvelleQueryDict
valeur. Dans ce cas, je ne pense pas que l'itération explicite soit évitable.Mes fonctions d'assistance ressemblent à ceci:
la source
Mettre à jour:
Remarque: soulignement
_
dans la méthode iterlists dequeryDict
. Version de Django: 1.5.1la source
dict(request.POST)
renvoie un dictionnaire python étrange avec des valeurs enveloppées dans un tableau.où as
{x:request.POST.get(x) for x in request.POST.keys()}
renvoie la sortie attendue.la source
QueryDict.dict()
(c'est-à-direrequest.POST.dict()
) et il retournera les valeurs correctement.ajoutez simplement
queryDict=dict(request.GET)
ouqueryDict=dict(QueryDict)
Dans votre vue et les données seront enregistrées dans querDict en tant que python Dict.
la source
Voici comment j'ai résolu ce problème:
la source
Comme moi, vous êtes probablement plus familier avec les
Dict()
méthodes en python. Cependant, leQueryDict()
est également un objet facile à utiliser. Par exemple, vous souhaitiez peut-être obtenir la valeur du fichierrequest.GET QueryDict()
.Vous pouvez le faire comme ceci:
request.GET.__getitem__(<key>)
.QueryDict()
documentation: https://docs.djangoproject.com/en/2.0/ref/request-response/#django.http.QueryDictla source
request.GET.get(<key>)
ourequest.GET.getlist(<key>)
Avec
Django 2.2
il existe peu de solutions propres:QueryDict.dict()
est le plus simple mais il casseraQueryDict
avec des listes comme valeurs, par exemple:sortira
dict(QueryDict)
est mieux car il fera un dictionnaire correct des listes:sortira
qui est correct.
la source
J'ai essayé les deux
dict(request.POST)
etrequest.POST.dict()
et j'ai réalisé que si vous aviez deslist
valeurs par exemple'var1':['value1', 'value2']
imbriquées dans votrerequest.POST
, le later (request.POST.dict()
) ne me donnait accès qu'au dernier élément d'une liste imbriquée tandis que l'ancien (dict(request.POST)
) me permettait d'accéder à tous les éléments d'une liste imbriquée.J'espère que ça aidera quelqu'un.
la source