我的模型看起来像这样:
class Business(models.Model):
name = models.CharField('business name', max_length=100)
# ... some other fields
emails = models.ManyToManyField(Email, null=True)
phone_numbers = models.ManyToManyField(PhoneNumber, null=True)
urls = models.ManyToManyField(URL, null=True)
和相应的ModelForm:
class BusinessContactForm(forms.ModelForm):
emails = forms.CharField(widget=forms.Textarea(attrs={'rows':4,'cols':32}))
phone_numbers = forms.CharField(widget=forms.Textarea(attrs={'rows':4,'cols':32}))
urls = forms.CharField(widget=forms.Textarea(attrs={'rows':4,'cols':32}))
class Meta:
model = Business
fields = ['emails', 'phone_numbers', 'urls',]
我的问题:在呈现表单时,将现有的电子邮件,phone_numbers和url加载到Textarea小部件中的最佳方法是什么?(在各自的小部件中每行一个)?
然后,在修改并提交表单后,确保添加任何新电子邮件,数字或网址(m2m关系)的最佳方法是什么,并删除列表中不再包含的任何内容(同时确保不添加重复项?)
答案 0 :(得分:1)
这不是您问题的直接答案。这是一个重新考虑数据模型的建议。
看起来您的BusinessContactForm会显示textarea小部件,以便在数据库中插入多行。我不会将Textarea小部件用于更多限制类型的项目:我输入带有电话号码小部件的电话号码,带有URL小部件的URL以及带有电子邮件小部件的电子邮件。
商务联系人实际上是为公司工作并拥有电子邮件地址和电话号码的人,对吗?那么为什么不建模这样的业务联系并为业务提供外键呢?
这就是我采取的方法。
答案 1 :(得分:1)
这真的不是一个很好的方法。处理表单上的相关项目是formsets的用途。
不要将相关字段定义为BusinessForm模型上的额外字段,而是使用联系人的标准表单,包括电子邮件,电话和网址。然后将其传递给modelformset_factory,为BusinessContact表单创建内联formset。