2014-02-10 32 views
6

我有一个表格只有一个字段,它是一个MultipleChoiceField。在模板中,它正在使用同一HTML表单(如描述的here)内的另外两个表单ModelForm打印。Django forms.MultipleChoiceField只选择一个值

当阅读完所有的视图中的数据POST的,一切都在那里,只是从这个MultipleChoiceField,这是从形式,如果从request.POST['field']直中选择只显示最后选定值的值正常工作 - 但足够有趣,如果我打印request.POST,选中的所有内容都在那里。这怎么可能?这真令我困惑。

这是以下形式:

class EstadosAtendidosForm(forms.Form): 
    estadosSelecionados = forms.MultipleChoiceField(choices = choices.UF.list) 

这是视图:

@login_required 
@csrf_protect 
def cadastro_transportadora(request): 
    if request.method == 'POST': 
     print request.POST 
     print len(request.POST['estadosSelecionados']) 
     print request.POST 
     estadosSelecionados = request.POST['estadosSelecionados'] 
     for estado in estadosSelecionados: 
      print estado 

     form_end = EnderecoForm(request.POST) 
     form_transp = TransportadoraForm(request.POST) 



    else: 
     transportadora_form = TransportadoraForm() 
     endereco_form = EnderecoForm() 
     estados_form = EstadosAtendidosForm() 
     return render(request, 'transporte/transportadora/cadastro.html', {'transportadora_form': transportadora_form, 'endereco_form': endereco_form, 'estados_form': estados_form}) 

而这是模板:

{% extends "transporte/base.html" %} 

{% block main %} 
<h1>Cadastro de Transportadora</h1> 
<form enctype="multipart/form-data" action="" method="POST"> 
    {% csrf_token %} 
    <h4>Dados da transportadora</h4> 
    {{ transportadora_form.as_p }} 
    <h4>Endereço</h4> 
    {{ endereco_form.as_p }} 
    <h4>Estados atendidos</h4> 
    {{ estados_form.as_p }} 
    <input type="submit" /> 
</form> 
{% endblock %} 

从打印视图中的输出,自5号线至10号线如下:

<QueryDict: {u'nome': [u'Test name'], u'bairro': [u'Estrela'], u'logradouro': [u'R. SHudhsu'], u'numero': [u'234'], u'estadosSelecionados': [u'AM', u'RJ', u'SP'], u'telefone': [u'+559965321232'], u'cep': [u'88088888'], u'csrfmiddlewaretoken': [u'mQhxZlbosISw4acZOmTWw6FpaQPwg2lJ'], u'estado': [u'AM'], u'email': [u'[email protected]']}> 
2 
<QueryDict: {u'nome': [u'Test name'], u'bairro': [u'Estrela'], u'logradouro': [u'R. SHudhsu'], u'numero': [u'234'], u'estadosSelecionados': [u'AM', u'RJ', u'SP'], u'telefone': [u'+559965321232'], u'cep': [u'88088888'], u'csrfmiddlewaretoken': [u'mQhxZlbosISw4acZOmTWw6FpaQPwg2lJ'], u'estado': [u'AM'], u'email': [u'[email protected]']}> 
S 
P 

当我打印整个request.POST数据时,看到变量estadosSelecionados确实包含我从表格中正确选择的3个值,但是当我仅打印request.POST['estadosSelecionados']时,它没有。

为什么?我真的需要帮助来理解这一点。谢谢。

回答

5

POST是一个QueryDict对象,当在HTTP POST中为同一个键提交多个值时,该对象具有特殊行为。要获得所有这些,请使用getlist方法。或者,只需使用您的表单 - 表单字段将为您收集多个值。

0

你不应该在request.POST看。使用表单的关键在于它处理类型转换等事情。检查form.is_valid()后,查看form.cleaned_data['estadosSelecionados']