Equivalente di Django dell'array di valori di forma / array associativo di PHP
Domanda
In PHP, lo farei per ottenere name
come array.
<input type"text" name="name[]" />
<input type"text" name="name[]" />
O se volessi ottenere name
come array associativo:
<input type"text" name="name[first]" />
<input type"text" name="name[last]" />
Qual è l'equivalente di Django per tali cose?
Soluzione
Consulta la documentazione di QueryDict , in particolare l'utilizzo di QueryDict.getlist ( chiave)
.
Poiché request.POST e request.GET nella vista sono istanze di QueryDict, è possibile eseguire questa operazione:
<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>
Quindi qualcosa del genere:
def mypath(request):
if request.method == 'POST':
greetings = request.POST.getlist('hi') # will be ['heya1','heya2']
Altri suggerimenti
Ci scusiamo per averlo scoperto, ma Django ha un utils.datastructures.DotExpandedDict. Ecco un pezzo dei suoi documenti:
>>> 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']}}}
L'unica differenza è che usi punti anziché parentesi.
EDIT: questo meccanismo è stato sostituito dai prefissi del modulo, ma ecco il vecchio codice che puoi rilasciare nella tua app se vuoi ancora usare questo concetto: https://gist.github.com/grzes/73142ed99dc8ad6ac4fc9fb9f4e87d60
Django non fornisce un modo per ottenere array associativi (dizionari in Python) dall'oggetto richiesta. Come sottolineato dalla prima risposta, puoi usare .getlist ()
secondo necessità, oppure scrivere una funzione che può prendere un QueryDict
e riorganizzarlo a tuo piacimento (estraendo il tasto / value se la chiave corrisponde ad un modello key [*]
, ad esempio).