2010-10-11 10 views
48

En una vista de django, etc., puede acceder a la solicitud .GET ['variablename'], por lo que en su vista puede volver a hacer algo como esto:Manejo de request.GET de Django y variables múltiples para el mismo nombre de parámetro

myvar = request.GET['myvar'] 

el request.GET real [ 'mivar'] tipo de objeto es:

<class 'django.http.QueryDict'> 

Ahora, si quieres pasar múltiples variables con el mismo nombre de parámetro es decir

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

En otras palabras, que le gustaría una lista de Python regresaron para el parámetro mivar

Esencialmente lo que me gustaría hacer es algo como esto

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

Sin embargo, cuando intentas obtener el último valor pasado en la url, es decir, en el ejemplo anterior obtendrás

y el resultado en la cáscara será:

5 
6 
7 

Sin embargo, cuando se hace una impresión de request.GET que parece que tiene una lista es decir:

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

actualización Ok: Está diseñado para devolver el último valor, mi caso de uso es que necesito una lista.

de django docs:

QueryDict. getitem (clave) Devuelve el valor de la clave especificada. Si la clave tiene más de un valor, getitem() devuelve el último valor. Aumenta django.utils.datastructures.MultiValueDictKeyError si la clave no existe. (Esta es una subclase de de Python estándar KeyError, por lo que puede pegarse a la captura de KeyError

QueryDict.getlist (clave) Devuelve los datos con la clave solicitada, como una lista Python. Devuelve una lista vacía si la clave no existe está garantizado para devolver una lista de algún tipo

actualización:.. Si alguien sabe por qué django dev de haber hecho esto, por favor hágamelo saber, parece contrario a la intuición para mostrar una lista y no se comporta como uno. ¡No muy pitónico!

+2

Creo que el razonamiento es que debe saber si se espera una lista o un valor individual. QueryDict.getitem no debe devolver una lista a veces, un elemento individual otras veces; entonces, todos tendrían que verificar siempre su tipo de devolución para manejarlo correctamente. – jgiles

Respuesta

112

desea que la función getlist() del objeto GET:

request.GET.getlist('myvar') 
+5

Puede necesitar agregar un "[]" al final del nombre var si está usando jquery para publicar elementos. –

+1

Sabía acerca de la lista de contactos, pero el "[]" me tiró. Además, tengo un amigo llamado Andy Staple, y por un segundo pensé que sabía mucho más de Django de lo que creía. Eso me arrojó también. – kungphu

+1

Esto debe escribirse en todos los documentos de Django, documentos de Django Rest Framework y al revés en mi frente. Esto realmente me pilló desprevenido –

1

Otra solución es la creación de una copia de la solicitud objeto ... Normalmente, no se puede iterar a través de un request.GET u objeto request.POST , pero puede hacer tales operaciones en la copia:

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

? esto no cambia el comportamiento de QueryDict en absoluto para mí. Acabo de obtener otro QueryDict con la misma "limitación" – nuts

Cuestiones relacionadas