2011-03-02 20 views
11

Tengo un cliente jQuery que está enviando una solicitud POST con una matriz multidimensional, algo como esto:lectura matrices multidimensionales de una solicitud POST en Django

friends[0][id] 12345678 
friends[0][name] Mr A 
friends[1][id] 789
friends[1][name] Mr B 

Es decir, un conjunto de dos artículos, nombre e id.

¿Hay una manera automática de recibir esta entrada como una lista o un diccionario? Parece que no puedo hacer el trabajo .getlist

+0

Muéstranos el código jQuery. Ese no es el formato normal para elementos multivalor en HTTP POST. –

+0

Gracias Daniel - mira la respuesta de DrMeers a continuación, muestra el problema que me estoy encontrando pero estaba buscando una mejor solución. – Liorsion

Respuesta

5

esto está relacionado con that question. Como dije allí, hice una biblioteca especial para Django/Python para manejar matrices multidimensionales enviadas a través de solicitudes. Puede encontrarlo en GitHub here.

+0

Gracias Berni. Terminé haciendo lo que Herman sugirió, pero creo que esta solución es más limpia ... – Liorsion

+0

¡Gran biblioteca! ¡Gracias! – kronosapiens

3

¿Esto sirve? http://dfcode.com/blog/2011/1/multi-dimensional-form-arrays-and-django/

Si desea que los datos de la POST, la única manera de conseguirlo es especificar el 'nombre' exacto que están buscando:

person[1].name = request.POST['person[1][name]'] 
    person[1].age = request.POST['person[1][age]'] 
    person[2].name = request.POST['person[2][name]'] 
    person[2].age = request.POST['person[2][age]'] 

Aquí es una rápida solución sobre la marcha en Python cuando se tiene la necesidad de extraer los valores del formulario sin tener que escribir de forma explícita el nombre completo como una cadena:

person_get = lambda *keys: request.POST[ 
     'person' + ''.join(['[%s]' % key for key in keys])] 

Ahora, cuando se necesita información, lanzar uno de estos retoños en y tendrás mucho más amplia flexibilidad. Ejemplo rápido: enlace

person[1].name = person_get('1', 'name') 
    person[1].age = person_get('1', 'age') 
    person[2].name = person_get('2', 'name') 
    person[2].age = person_get('2', 'age') 
+1

El enlace está roto. Resuma la información en esta respuesta, o necesita ser eliminada debido a la falta de contexto. Es por eso que responder con solo un enlace es una mala idea, tienden a romperse de vez en cuando. –

+0

'¿Esto ayuda?' No. – Will

+0

Ahí tienes. Gracias Google-caché ... – DrMeers

7

DrMeers' ya no es válido, por lo que voy a publicar otro método para lograr la misma cosa. Tampoco es perfecto, y sería mucho mejor si Django tuviera incorporada dicha función. Pero, ya que no hace:

Converting Multi-dimensional Form Arrays in Django

Negación: escribió ese puesto. La esencia de la misma es en esta función, que podría ser más robusto, pero funciona para matrices de objetos de un solo nivel:

def getDictArray(post, name): 
    dic = {} 
    for k in post.keys(): 
     if k.startswith(name): 
      rest = k[len(name):] 

      # split the string into different components 
      parts = [p[:-1] for p in rest.split('[')][1:] 
      print parts 
      id = int(parts[0]) 

      # add a new dictionary if it doesn't exist yet 
      if id not in dic: 
       dic[id] = {} 

      # add the information to the dictionary 
      dic[id][parts[1]] = post.get(k) 
    return dic 
+0

Gracias Herman ... no * exactamente * lo que necesitaba pero lo suficientemente cerca. Creo que un resultado más preciso devolvería una lista de diccionarios y no un diccionario de diccionario, pero es más o menos lo mismo. ¡Una vez más, gracias! – Liorsion

+0

maravillosamente simple - gracias! –

+2

@Liorsion: al reemplazar la última línea con "return [item for key, item in sorted (dic.items())]" tendrá la lista correspondiente como objeto de devolución. –

Cuestiones relacionadas