Django equivalente de la matriz de valores de forma de PHP / matriz asociativa
Pregunta
En PHP, haría esto para obtener name
como una matriz.
<input type"text" name="name[]" />
<input type"text" name="name[]" />
O si quisiera obtener name
como una matriz asociativa:
<input type"text" name="name[first]" />
<input type"text" name="name[last]" />
¿Cuál es el equivalente de Django para tales cosas?
Solución
Consulte la documentación de QueryDict , en particular el uso de QueryDict.getlist ( clave)
.
Dado que request.POST y request.GET en la vista son instancias de QueryDict, puede hacer esto:
<form action='/my/path/' method='POST'>
<input type='text' name='hi' value='heya1'>
<input type='text' name='hi' value='heya2'>
<input type='submit' value='Go'>
</form>
Entonces algo como esto:
def mypath(request):
if request.method == 'POST':
greetings = request.POST.getlist('hi') # will be ['heya1','heya2']
Otros consejos
Lo siento por desenterrar esto, pero Django tiene un utils.datastructures.DotExpandedDict. Aquí hay una parte de su documentación:
>>> d = DotExpandedDict({'person.1.firstname': ['Simon'], \
'person.1.lastname': ['Willison'], \
'person.2.firstname': ['Adrian'], \
'person.2.lastname': ['Holovaty']})
>>> d
{'person': {'1': {'lastname': ['Willison'], 'firstname': ['Simon']}, '2': {'lastname': ['Holovaty'], 'firstname': ['Adrian']}}}
La única diferencia es que usas puntos en lugar de corchetes.
EDITAR: Este mecanismo fue reemplazado por los prefijos de formulario, pero aquí está el código antiguo que puede colocar en su aplicación si aún desea usar este concepto: https://gist.githffcccccccccccccccffc9f4fc9c4fc9p4fc9ccccccccc9vfc9vcccccc9vgvfvf_vf_vf_9_c_f9_9_f9_9_v_c_f_9_f_c_f_9_f_9_f_c_f_c_f_9_c_f_9_c_fc_fc_f9_v_v_v_v_v_v_v_v_v__v_9_c_9_c_f_9_f9_c_9_c99_c99_ed99dc8ad6ac4fc9f4fccc9799kpc9tave.org
Django no proporciona una forma de obtener matrices asociativas (diccionarios en Python) del objeto de solicitud. Como señaló la primera respuesta, puede usar .getlist ()
según sea necesario, o escribir una función que pueda tomar un QueryDict
y reorganizarlo a su gusto (extrayendo la tecla) / pares de valores si la clave coincide con algún patrón de clave [*]
, por ejemplo).