代码之家  ›  专栏  ›  技术社区  ›  Kurt Peek

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

  •  2
  • Kurt Peek  · 技术社区  · 7 年前

    我有一个子类 ModelForm , FamilyDemographicsForm ,其中两个 ChoiceField 需要: point_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.']}
    

    我的问题是:有什么方法可以实例化一个有效的 模型形式 具有 data 是否不包括必填字段?E、 g.通过提供适当的 initial instance 论点(我从的源代码中还不清楚这一点 BaseModelForm 在…上 https://github.com/django/django/blob/master/django/forms/models.py ).

    1 回复  |  直到 7 年前
        1
  •  2
  •   KryÅ¡tof Řeháček    7 年前

    您可以修改 ModelForm Form Django提供给他们满足您的需求。您可以根据需要重写每个方法。最基本和最基本的预填充是提供 initial 数据为{field\u name:value,…}的dict表格接受,无需任何修改。

    比如你有这个

    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文件: Providing initial values

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