我有以下Django模型:
class Contact(models.Model):
id #primary key
#Other contact info
class ContactType(models.Model):
contacttype_choices=(('Primary', 'Primary'),
('Billing', 'Billing'),
('Business', 'Business'),
('Technology', 'Technology'))
contact=models.ForeignKey(Contact)
type=models.CharField(choices=contacttype_choices, max_length=30)
class Meta:
unique_together=('contact', 'type')
因此,任何联系人对象最多可以有四种联系类型,每种类型都存在或不存在。我想为Contact
创建一个模型表单,其中包含联系人类型的多选字段。当我使用Contact实例构建Contact表单时,如何使用现有值填充此联系类型字段?
编辑为了澄清,我想为这四个选项中的每一个创建一个复选框,如果表单是使用模型实例实例化的,那么我希望每个复选框都要检查存在的相关对象,类似于其他字段自动发生的对象。
答案 0 :(得分:1)
我可能会这样构建模型,因此我可以在创建/编辑联系人时选择哪种联系人类型。如果ContactType与ManyToMany相关,我们会自动在ModelForm中获取ModelMultpleChoiceField,我们需要做的就是使用CheckboxSelectMultiple小部件来获取您正在寻找的输出。
当我们将Contact的一个实例传递给ContactForm时,Django将绑定任何预先选择的ContactType选项,并选中我们的复选框。
将每个ContactType的标题设置为唯一,与联系人和contact_type上的unique_together相同。
#models.py
class Contact(models.Model):
#other fields
contact_types = models.ManyToMany(ContactType)
class ContactType(models.Model):
title = models.CharField(max_length=20, unique=true)
#forms.py
class ContactForm(forms.ModelForm):
class Meta:
model = Contact
def __init__(self, *args, **kwargs):
super(ContactForm, self).__init__(*args, **kwargs)
self.fields['contact_types'].widget = forms.CheckboxSelectMultiple()
答案 1 :(得分:1)
你尝试过这样的事吗?
class ContactForm(forms.ModelForm):
class Meta:
model = Contact
def __init__(self, *args, **kwargs):
super(ContactForm, self).__init__(*args, **kwargs)
self.fields['contacttypes'] = forms.MultipleChoiceField(
choices = CONTACT_TYPE_CHOICES,
label = "contact type",
widget = CheckBoxSelectMultiple
)
contact = Contact.objects.get(pk=1) # or whatever
types = ContactType.objects.filter(contact = contact)
form = ContactForm(instance=contact, initial={'contacttypes' : types})