使用初始数据填充选择

时间:2016-07-22 12:07:44

标签: django django-forms django-templates django-views

我试图在我的模板中填充一个<select>元素,其中包含来自表单字段的数据,如下所示:

forms.py

class CreatePlayerForm(forms.Form):
    size = forms.CharField()

views.py

class CreatePlayer(FormView):
    ...
    def get(self, request, *args, **kwargs):
        ...
        boots = Boots.objects.filter(...).values_list('size', flat=True) # return a list

    form.initial['boots'] = boots

模板

<select id="leftValues4" size="5" multiple>
    {% for boot in form.boots %}
        <option>{{ boot }}</option>
    {% endfor %}
</select>

使用上面的代码我得不到任何结果。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

你根本没有以正确的方式接近这一点。

initial专门用于预先设置选择的值。您正在尝试填充值的列表。为此,您需要使用支持此类列表的实际字段;那是一个ChoiceField,而不是CharField。

其次,选择需要具有ID值和显示值;所以你需要一个2元组的列表/元组。

表格:

class CreatePlayerForm(forms.Form):
    size = forms.ChoiceField(choices=[])

    def __init__(self, *args, **kwargs):
        sizes = kwargs.pop('sizes')
        super(CreatePlayerForm, self).__init__(*args, **kwargs)
        self.fields['sizes'].choices = sizes

视图:

class CreatePlayer(FormView):
    ...
    def get_form_kwargs(self, *args, **kwargs):
        form_kwargs = super(CreatePlayer, self).get_form_kwargs(*args, **kwargs)
        boots = Boots.objects.filter(...).values_list('id', 'size')
        form_kwargs['sizes'] = boots
        return form_kwargs

模板:

{{ form.boots }}