通过选择多个循环遍历django中的表单字段

时间:2017-06-22 20:35:49

标签: python django

class form(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        u = User.objects.get(user=user)
        super(form, self).__init__(*args, **kwargs)

        self.fields['phone'].queryset = Phone.objects.filter(user=u)

    class Meta:
        model = MyModel
        fields = ["name", "description", , "phone"]

此表单使用属于当前登录用户的电话预填充现场电话。我使用{{form.as_p}}显示了要显示的模板,但我不知道如何在html模板中手动显示要选择的预填充电话名称的字段。

我尝试了下面的代码段作为更大表单的一部分,但它没有用。

<select multiple="multiple" id="id_phone" name="phone" required>
            {% for p in phone %}
            <option value="{{ p.id }}">{{ p.name }}</option>
            {% endfor %}
</select>

此外,如何使用此预填充方法允许用户一次选择多个电话。我尝试使用ModelMultipleChoiceField,但它没有用。

1 个答案:

答案 0 :(得分:0)

在这种情况下,您需要两件事

  1. 设置字段的初始值
  2. 将字段小部件设置为可以选择多个值
  3. 幸运的是,Django已经有了一个小部件!

    以下代码将实现您的目标:

    class form(forms.ModelForm):
        def __init__(self, *args, **kwargs):
            user = kwargs.pop('user')
            u = User.objects.get(user=user)
            kwargs["initial"].update({
                "phone": Phone.objects.filter(user=u)
            })
            super(form, self).__init__(*args, **kwargs)
    
        class Meta:
            model = MyModel
            widgets = {
                "phone": SelectMultiple
            }
            fields = ["name", "description", "phone"]
    

    有了这两件,模板就变得简单了!

    {{ form.phone.errors }}  {# shows on page any errors during clean #}
    {{ form.phone }}         {# renders the widget #}
    

    如果您不想使用Django提供的内置窗口小部件,请查看creating your own

    有关设置初始值的其他方法,请结帐this post