Django:我如何创建一个多选表单?

Cod*_*ist 11 python forms django field multiple-select

我是Django/Python的初学者,我需要创建一个多选表单.我知道这很容易,但我找不到任何例子.我知道如何使用小部件创建CharField但我对fields.py中的所有选项感到困惑.

例如,我不知道以下哪一个最适合多选形式.

'ChoiceField', 'MultipleChoiceField',
'ComboField', 'MultiValueField',
'TypedChoiceField', 'TypedMultipleChoiceField'
Run Code Online (Sandbox Code Playgroud)

这是我需要创建的表单.

        <form action="" method="post" accept-charset="utf-8">
        <select name="countries" id="countries" class="multiselect" multiple="multiple">
            <option value="AUT" selected="selected">Austria</option>
            <option value="DEU" selected="selected">Germany</option>
            <option value="NLD" selected="selected">Netherlands</option>
            <option value="USA">United States</option>
        </select>
        <p><input type="submit" value="Continue &rarr;"></p>
    </form>
Run Code Online (Sandbox Code Playgroud)

编辑:

还有一个小问题.如果我想向每个选项添加一个属性,如数据:

 <option value="AUT" selected="selected" data-index=1>Austria</option>
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

谢谢你的帮助!

vib*_*hor 29

我认为CheckboxSelectMultiple应该可行.根据您的问题,在您的forms.py中使用以下代码

from django import forms


class CountryForm(forms.Form):
    OPTIONS = (
        ("AUT", "Austria"),
        ("DEU", "Germany"),
        ("NLD", "Neitherlands"),
    )
    Countries = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple,
                                          choices=OPTIONS)
Run Code Online (Sandbox Code Playgroud)

编辑:我想写完整的代码流,以便您可以更好地理解它.因为你可能会感到困惑

在Views.py中定义以下函数

def countries_view(request):
    if request.method == 'POST':
        form = CountryForm(request.POST)
        if form.is_valid():
            countries = form.cleaned_data.get('countries')
            # do something with your results
    else:
        form = CountryForm

    return render_to_response('render_country.html', {'form': form},
                              context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

在你的render_country.html中

<form method='post'>
    {% csrf_token %}
    {{ form.as_p }}
    <input type='submit' value='submit'>
</form>
Run Code Online (Sandbox Code Playgroud)

我希望这会有所帮助.让我知道这是否是你所期待的.


pro*_*san 6

我是这样做的:

表格.py

class ChoiceForm(ModelForm):
    class Meta:
        model = YourModel

    def __init__(self, *args, **kwargs):
        super(ChoiceForm, self).__init__(*args, **kwargs)
        self.fields['countries'] =  ModelChoiceField(queryset=YourModel.objects.all()),
                                             empty_label="Choose a countries",)
Run Code Online (Sandbox Code Playgroud)

网址.py

from django.conf.urls.defaults import * 
from django.views.generic import CreateView
from django.core.urlresolvers import reverse

urlpatterns = patterns('',
    url(r'^$',CreateView.as_view(model=YourModel, get_success_url=lambda: reverse('model_countries'),
        template_name='your_countries.html'), form_class=ChoiceForm, name='model_countries'),)
Run Code Online (Sandbox Code Playgroud)

your_countries.html

<form action="" method="post">
    {% csrf_token %}
    {{ form.as_table }}
    <input type="submit" value="Submit" />
</form> 
Run Code Online (Sandbox Code Playgroud)

在我的例子中它工作正常,如果你需要更多的东西,问我!!