我有几个型号:电话,电子邮件,人物。我想遵循DRY开发路径,目前我正在实现ModelForms。 (Django 1.6)
我需要能够接受两个“人物”的实例,第二个是可选,如果不存在,则相关的电话和电子邮件表单不应该验证。我也可以接受多个电话和电子邮件实例,但只有需要其中一个。
伪模式
class Person(modelForm):
first_name = CharField
last_name = CharField
...
class Phone(modelForm):
person_ID = ForeignKey(Person)
typ = CharField(choices = ...)
number = CharField
class Email(modelForm):
person_ID = ForeignKey(Person)
typ = CharField(choices = ...)
email = CharField
Pseudo-Form Templete
form>
{{Location_Contact}} #<-required
{{Location_Phone_1}} #<-required
{{Location_Phone_2}} #<-optional but if a field is filled in preform validation
{{Location_Email_1}} #<-required
# optional below but if any part is filled in, treat it like the above
{{Billing_Contact}}
{{Billing_Phone_1}}
{{Billing_Phone_2}}
{{Billing_Email_1}}
/form>
如果我能找到一种方法来检查并查看表格是否未受影响并且部分填写,我可能会完成这项工作;但我还没有找到一种可行的方法。 我对Django很新,也许会以错误的方式解决这个问题,任何指针都会受到赞赏,即使它是彻底的改革。
答案 0 :(得分:4)
您应该使用Django built-in Formsets module。它专门用于支持此类用例和类似用例。
from django.forms.formsets import formset_factory
PersonFormSet = formset_factory(
PersonForm,
extra=2,
max_num=2,
min_num=1,
validate_min=True
)
extra=2
表示将显示两个空表单。max_num=2
表示只会显示两个表单(只有编辑表单才有意义)min_num=1
与validate_min=True
一起表示用户需要填写至少一份表单。请注意,当前开发版本中添加了validate_min
,并且在Django 1.7中可以使用{{1}}。在Django中,你需要使用custom formset validation来达到同样的效果。