Django equivalente de matriz valor forma de matriz de PHP / associativo
Pergunta
No PHP, eu faria isso para obter name
como uma matriz.
<input type"text" name="name[]" />
<input type"text" name="name[]" />
Ou se eu queria ficar name
como uma matriz associativa:
<input type"text" name="name[first]" />
<input type"text" name="name[last]" />
O que é o equivalente Django para essas coisas?
Solução
Confira a documentação QueryDict , particularmente o uso do QueryDict.getlist(key)
.
Desde request.POST e request.GET na vista são instâncias de QueryDict, você poderia fazer isso:
<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>
Em seguida, algo como isto:
def mypath(request):
if request.method == 'POST':
greetings = request.POST.getlist('hi') # will be ['heya1','heya2']
Outras dicas
Infelizmente para cavar isso, mas Django tem um utils.datastructures.DotExpandedDict. Aqui está um pedaço dele de docs:
>>> 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']}}}
A única diferença é que você usa dot é em vez de colchetes.
EDIT: Este mecanismo foi substituído por prefixos de formulário, mas aqui está o código antigo que você pode cair em seu aplicativo se você ainda quiser usar este conceito: https://gist.github.com/grzes/73142ed99dc8ad6ac4fc9fb9f4e87d60
Django não fornece uma maneira de obter arrays associativos (dicionários em Python) do objeto de solicitação. Como a primeira resposta apontou, você pode usar .getlist()
conforme necessário, ou escrever uma função que pode levar um QueryDict
e reorganizá-lo ao seu gosto (tirando pares de chave / valor se a chave corresponde algum padrão key[*]
, por exemplo).