webentwicklung-frage-antwort-db.com.de

Wie gehe ich mit request.GET mit mehreren Variablen für den gleichen Parameter in Django

In einer Django Ansicht können Sie auf die request.GET['variablename'], also können Sie Ihrer Ansicht nach so etwas tun:

myvar = request.GET['myvar']

Das aktuelle request.GET['myvar'] Objekttyp ist:

<class 'Django.http.QueryDict'>

Wenn Sie nun mehrere Variablen mit demselben Parameternamen übergeben möchten, d. H .:

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

Sie möchten ein python list, das für den Parameter myvar zurückgegeben wird, und dann folgendermaßen vorgehen:

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

Wenn Sie jedoch versuchen, dass Sie nur den letzten in der URL übergebenen Wert erhalten, d. H. Im obigen Beispiel, erhalten Sie 567, und das Ergebnis in der Shell lautet:

5
6
7

Wenn Sie jedoch einen Ausdruck von request.GET es scheint, als hätte es ein list d. h .:

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

Ok Update: Es wurde entwickelt, um den letzten Wert zurückzugeben. Mein Anwendungsfall ist, dass ich eine Liste benötige.

from Django docs:

QueryDict .getitem (key) Gibt den Wert für den angegebenen Schlüssel zurück. Wenn der Schlüssel mehr als einen Wert hat, gibt getitem () den letzten Wert zurück. Löst Django.utils.datastructures.MultiValueDictKeyError aus, wenn der Schlüssel nicht vorhanden ist. (Dies ist eine Unterklasse von Pythons Standard-KeyError. Sie können sich also daran halten, KeyError abzufangen

QueryDict.getlist (key) Gibt die Daten mit dem angeforderten Schlüssel als Python list zurück. Gibt eine leere Liste zurück, wenn der Schlüssel nicht vorhanden ist. Es wird garantiert eine Liste zurückgegeben.

Update: Wenn jemand weiß, warum Django dev's dies getan hat, lassen Sie es mich bitte wissen, scheint es nicht intuitiv zu sein, eine Liste anzuzeigen, und sie verhält sich nicht wie eine. Nicht sehr pythonisch!

66
ismail

Sie möchten die Funktion getlist () des GET-Objekts:

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

Eine andere Lösung ist das Erstellen einer Kopie des Anforderungsobjekts. Normalerweise können Sie ein request.GET- oder request.POST-Objekt nicht durchlaufen, Sie können jedoch folgende Vorgänge für die Kopie ausführen:

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