【问题标题】:Looping through form fields in django with select multiple使用多选循环遍历 django 中的表单字段
【发布时间】:2017-06-22 20:35:48
【问题描述】:
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 模板中手动显示带有要选择的预填充电话名称的字段。

我尝试了下面的 sn-p 作为更大表单的一部分,但它不起作用。

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

另外,我如何允许用户使用这种预填充方法一次选择多部手机。我尝试使用 ModelMultipleChoiceField 但它不起作用。

【问题讨论】:

  • 为什么需要手动显示?这是一个什么样的领域?当您尝试使用 ModelMultipleChoiceField 时,什么“不起作用”?
  • 我想手动完成,这样我就可以为每个输入和标签提供类,并能够按照我想要的方式进行设计。这是一个选择字段,它有选项,用户可以选择他们想要添加的电话。当我尝试使用 ModelMultipleChoiceField 时,我只是不知道如何从 self.fields['phone'].queryset 传入查询集

标签: python django


【解决方案1】:

在这种情况下你需要两件事

  1. 为字段设置初始值
  2. 将字段小部件设置为能够选择多个值

幸运的是,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

【讨论】:

  • initial 是一个传递给 BaseForm 的 kwarg,它为您的表单设置初始值
  • 这个答案非常好。您如何将 css 应用到 {{form.phone}}
猜你喜欢
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
相关资源
最近更新 更多