【问题标题】:Django forms.MultipleChoiceField only selects one valueDjango forms.MultipleChoiceField 只选择一个值
【发布时间】:2014-03-07 04:18:39
【问题描述】:

我有一个只有一个字段的表单,即MultipleChoiceField。在模板中,它与其他两个表单一起打印,它们是同一 HTML 表单中的 ModelForms(如 here 所述)。

当读取视图中的所有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'test@email.com']}>
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'test@email.com']}>
S
P

当我打印整个 request.POST 数据时,看到变量 estadosSelecionados 确实包含我从表单中选择的 3 个值,正确地,作为一个列表,但是当我只打印 request.POST['estadosSelecionados'] 时,它没有t.

为什么?

【问题讨论】:

    标签: python django


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您不应该查看 request.POST。使用表单的全部意义在于它会处理类型转换之类的事情。检查form.is_valid() 后查看form.cleaned_data['estadosSelecionados']

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-30
        • 2017-09-19
        • 2021-05-12
        • 2018-02-23
        • 1970-01-01
        • 2015-07-21
        • 1970-01-01
        相关资源
        最近更新 更多