Django Forms - 从多个选择字段中获取数据

Dar*_*ech 8 forms django get

我有一个这样的表格:

class MyForm(forms.Form):
    site = forms.ChoiceField(choices=SITE_CHOICES, label=ugettext_lazy('Site'),)  
    ...
    params = forms.MultipleChoiceField(
             choices=PARAM_CHOICES,
             label=ugettext_lazy('Select Parameters'),
             widget=forms.CheckboxSelectMultiple()
             )
Run Code Online (Sandbox Code Playgroud)

在我的模板中:

<form action="{% url results %}" method="get">{% csrf_token %}
{% for field in myform %}
<div class="field_wrapper">
    {{ field.errors }}
    {{ field.label_tag }} {{ field }}
</div>
{% endfor %}
<input type="submit" name="submit" value="{% trans 'Query' %}"  />
</form>
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我将表单作为GET提交时,变量如下所示:

    site=1&params=foo&params=bar&params=something&submit=Query
Run Code Online (Sandbox Code Playgroud)

我的params变量显然被最后的选择覆盖了吗?如何将提交的数据作为单独的变量进行访问?

任何帮助赞赏.

Tho*_*zco 10

使用Django表单

应该使用Django的表单处理,POST这将使事情变得更容易.开始:

if request.method == 'GET':
    form = MyFormClass()
else:
    form = MyFormClass(request.POST)
    if form.is_valid():
        do_something_with(form.cleaned_data['params'])
        return redirect('somewhere')
return render_to_response('my_template.html', RequestContext(request, {'form':form}))
Run Code Online (Sandbox Code Playgroud)

使用GETvs POST与表单的注意事项

{% csrf_token %}如果您要GET使用表单,则无用包含(绝对没有csrf验证是通过GET请求完成的,这是有意义的,因为GET请求应该是非数据更改的.

无论如何,如果你真的要去GET页面,你仍然可以使用与之前编写的相同的逻辑,只需稍加调整:

form = MyFormClass(request.GET)
if form.is_valid():
    do_something_with(form.cleaned_data['params'])
    return render_to_response('some_template.html', {'stuff':some_stuff})
return render_to_response('form_submission_page.html', {'form':form})
Run Code Online (Sandbox Code Playgroud)

最后,使用GET提交数据通常是不好的做法,除非你创建一些搜索功能或改变显示(分页和所有).

运用 request.GET

现在,如果由于某种原因你不想使用Django表单,你仍然可以解决问题并检索你的params,你只需要使用QueryDict.getlist而不是使用QueryDict.get方法.

开始:

my_data = request.GET.getlist('params')
Run Code Online (Sandbox Code Playgroud)

文档

不要忘记对检查出的Django文档QueryDictsforms