如何使用预填充的必填字段实例化Django ModelForm?

时间:2018-02-15 01:56:42

标签: python django forms modelform

我有一个def trim_to_date(s): return s.split()[0] date = date[0].apply(trim_to_date) dt = np.array(date)) ModelForm的子类,需要两个FamilyDemographicsFormChoiceFieldpoint_of_contact。例如,以下测试通过:

birth_parent

在第二个测试用例中,class FamilyDemographicsFormTest(TestCase): def test_empty_form_is_not_valid(self): '''The choice fields 'point_of_contact' and 'birth_parent' are the only two required fields of the form''' form = FamilyDemographicsForm(data={}) # The form is not valid because the required fields have not been provided self.assertFalse(form.is_valid()) self.assertEqual(form.errors, {'point_of_contact': ['This field is required.'], 'birth_parent': ['This field is required.']}) def test_form_with_required_fields_is_valid(self): '''The form's save() method constructs the expected family''' data = {'point_of_contact': Family.EMPLOYEE, 'birth_parent': Family.PARTNER} form = FamilyDemographicsForm(data=data) self.assertTrue(form.is_valid()) # The family returned by saving the form has the expected attributes family = form.save() self.assertEqual(family.point_of_contact, Family.EMPLOYEE) self.assertEqual(family.birth_parent, Family.PARTNER) # The family exists in the database self.assertTrue(Family.objects.filter(id=family.id).exists()) 上创建了Family的新实例。我想尝试更新现有的家庭。为了让我开始,我尝试了以下内容:

form.save()

但是,当我进入调试器时,我注意到def test_update_existing_family(self): initial = {'point_of_contact': Family.EMPLOYEE, 'birth_parent': Family.PARTNER} data = {'employee_phone': '4151234567', 'employee_phone_type': Family.IPHONE, 'partner_phone': '4157654321', 'partner_phone_type': Family.ANDROID} form = FamilyDemographicsForm(data=data, initial=initial) import ipdb; ipdb.set_trace() form.is_valid()False表示未提供必填字段:

form.errors

我的问题是:有没有办法用ipdb> form.errors {'point_of_contact': ['This field is required.'], 'birth_parent': ['This field is required.']} 实例化不包含必填字段的ModelForm?例如。通过提供适当的datainitial参数? (https://github.com/django/django/blob/master/django/forms/models.py上的instance源代码对我来说并不是很清楚。

1 个答案:

答案 0 :(得分:1)

您可以修改Django提供的ModelFormForm以满足您的需求。您可以根据需要覆盖每个方法。最基础和最重要的预填充是提供initial dict,其中包含表单接受的数据{field_name:value,...},无需任何修改。

所以例如你有这个

class Model1(models.Model):
    name = models.CharField(max_length=100)

和这个表格

class Model1ModelForm(forms.ModelForm):
    class Meta:
        model = Model1
        fields = ('name', )

您可以在视图中提供

的初始数据
initial = {'name': 'Initial name'}
form = Model1ModelForm(initial=initial)

因此,此表格中的名称将被预先填写。

django docs:Providing initial values

堆栈溢出:Pass initial value to a modelform in django