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,但它没有用。
答案 0 :(得分:0)
在这种情况下,您需要两件事
幸运的是,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