¿Cómo obtener una lista de valores de solicitud GET en Django?

Resuelto Praful Bagai asked hace 9 años • 5 respuestas

Tengo un punto final:

http://127.0.0.1:8000/auction/?status=['omn','aad']

Necesito obtener la lista de estado, por eso hago lo siguiente

print(request.GET.getlist('status'))
```

It returns me:

```lang-none
[u"['omn','aad']"]
```

which is a list of string of list.

I then use ast.literal_eval to convert string of list to list. Is there a direct method to get the list of status?
Praful Bagai avatar May 07 '15 23:05 Praful Bagai
Aceptado

En primer lugar, no lo envíes en ese formato. La forma estándar de enviar múltiples valores para un solo HTML es enviar el parámetro varias veces:

http://127.0.0.1:8000/auction/?status=omn&status=aad

que te dará correctamente ['omn','aad']cuando lo uses request.GET.getlist('status').

Daniel Roseman avatar May 07 '2015 17:05 Daniel Roseman

Ampliando la respuesta de @DanielRoseman.

La forma correcta sería pasar cada variable como se describe: http://127.0.0.1:8000/auction/?status=omn&status=aad.

Sin embargo, si está utilizando marcos de Javascript modernos (Vue, Angular, React), es muy probable que esté pasando parámetros como un objeto (por ejemplo, si está trabajando con axios, VueResource, etc.). Entonces, esta es la solución alternativa:

Interfaz:

let params = {
   status: ['omn', 'aad',]
}

return new Promise((resolve, reject) => {
  axios.get(`/auction/`, { params: params }, }).then(response => {
      resolve(response.data);
  }).catch(error => {
      resolve(error.response);
  });
});

Luego esto se enviará a Django como la siguiente URL:

[05/Aug/2019 10:04:42] "GET /auction/?status[]=omn&status[]=aad HTTP/1.1" 200 2418

Que luego se puede recoger en la vista correspondiente como:

# Before constructing **parameters, it may neccessary to filter out any supurfluous key, value pair that do not correspond to model attributes:
parameters['status__in'] = request.GET.getlist('status[]')

# Using parameters constructed above, filter the Auctions for given status:
auctions = Auction.objects.filter(is_active=True)

auctions = auctions.filter(**parameters)
Micheal J. Roberts avatar Aug 05 '2019 10:08 Micheal J. Roberts