有时候我们想在ModelForm之上增加几个字定义的字段,或者期望在一个页面上让用户同时填写两个表(model)的内容——比如某些1:1关系中,希望用户同时输入两个模型数据,后台同步保存。通过分析modelform的代码,其实可以非常轻松的达到我们的目标。
简单地说,这涉及到字段定义、数据初始化和数据保存三个层面的内容。
- 字段定义与普通的form的字段定义一样,新增的自定义控件也会自动加入到form的数据验证规则,这没什么可说的;
- 数据初始化的部分,只需要在form的"初始化函数"中通过initial赋值即可:
def __init__(self,data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=ErrorList, label_suffix=':', empty_permitted=False, instance=None): try: initial = initial or {} if not instance is None: family = instance.family initial.update({ 'revenue':family.revenue, 'revenue_source':family.revenue_source, 'family_situation':family.situation }) except Family.DoesNotExist: pass super(StudentForm,self).__init__(data,files,auto_id,prefix, initial,error_class,label_suffix, empty_permitted,instance)
- 数据保存,更是简单,直接重写form的save方法即可,当然别忘了调用父类的save