2010-07-24 3 views
15

Les docs Django disent à http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.QueryDict.iteritems que QueryDict.iteritems() utilise la même logique de dernière valeur que QueryDict.__getitem__(), ce qui signifie que si la clé a plus d'une valeur, __getitem__() renvoie la dernière valeur.comment obtenir toutes les valeurs d'une clé à valeurs multiples de la requête Django. GET QueryDict

Disons que print request.GET ressemble à ceci:

<QueryDict: {u'sex': [u'1'], u'status': [u'1', u'2', u'3', u'4']}>

Si je veux obtenir une chaîne comme sex=1&status=1&status=2&status=3&status=4 (commandes standard HTTP GET) le code suivant ne donnera pas les résultats escomptés en raison du comportement iteritems mentionné ci-dessus:

mstring = [] 
for gk, gv in request.GET.iteritems(): 
    mstring.append("%s=%s" % (gk, gv)) 
print "&".join(mstring) 

Quel est le moyen le plus efficace pour obtenir le résultat que je veux sans trop de bouclage?

Cordialement.

[EDIT]

Je dois dire que je ne suis pas le recours à QueryDict.urlencode() parce qu'il ya des clés dans ce request.GET que je ne veux pas dans la chaîne. Je pourrais modifier la chaîne et retirer ces clés, mais je me demandais simplement s'il y avait une meilleure façon de procéder. Je réalise que cette information aurait dû être explicitement mentionnée.

Répondre

11

Cela devrait fonctionner:

mstring = [] 
for key in request.GET.iterkeys(): # "for key in request.GET" works too. 
    # Add filtering logic here. 
    valuelist = request.GET.getlist(key) 
    mstring.extend(['%s=%s' % (key, val) for val in valuelist]) 
print '&'.join(mstring) 
+0

Parfait. Merci. – chefsmart

+0

Il existe un 'request.GET.iterlists()'. Aussi je pense que l'approche par la réponse de David ci-dessous est plus propre. – Ski

+0

@Ski: D'accord. C'est pourquoi je l'ai upvoted :-) Pourtant, n'aide pas si vous voulez filtrer un sous-ensemble de clés avant l'encodage. – elo80ka

8

Je crois QueryDict.urlencode atteint le résultat souhaité si tout ce que vous voulez faire est d'imprimer le QueryDict puis juste

print request.GET.urlencode() 

devrait faire l'affaire. Faites-moi savoir si vous essayez de faire autre chose et je vais essayer d'aider!

+0

Oui, cela fait l'affaire. Mais ce que je n'ai pas mentionné dans le post original (que je devrais avoir) est qu'il y a des clés dans request.GET que je ne veux pas dans la chaîne. Je pourrais chercher la corde et les sortir, mais je me demandais s'il y avait un autre moyen. Je vais modifier et reformuler ma question. – chefsmart

+3

'data = request.GET.copy()', puis supprimez des données des données dont vous n'avez pas besoin, puis faites 'data.urlencode()'. – Ski

20
request.META['QUERY_STRING'] 

donnera la chaîne de requête complète

ou si vous souhaitez obtenir la liste des valeurs pour une clé ex donnée: liste de valeurs pour le statut puis

request.GET.getlist('status') 
+3

fonctionne pour POST aussi - 'request.POST.getlist ('foo')' – northben

5
request.GET.getlist('status') 
0

vous pouvez transformer le querydict en dictionnaire

 
map(int,dict(request.GET)["status"]) 
Questions connexes