如何使用预填必填字段实例化 Django ModelForm?
How to instantiate a Django ModelForm with pre-filled required fields?
我有一个 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
实例化一个不包含必填字段的有效 ModelForm
吗?例如。通过提供适当的 initial
或 instance
参数? (从 https://github.com/django/django/blob/master/django/forms/models.py 上的 BaseModelForm
的源代码中,我无法立即清楚这一点)。
您可以修改 Django 提供的 ModelForm
和 Form
以满足您的需要。您可以根据需要覆盖每个方法。最基本和最重要的预填充是提供一个 initial
字典,其中包含表单接受的数据 {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 文档:Providing initial values
堆栈溢出:Pass initial value to a modelform in django
我有一个 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
实例化一个不包含必填字段的有效 ModelForm
吗?例如。通过提供适当的 initial
或 instance
参数? (从 https://github.com/django/django/blob/master/django/forms/models.py 上的 BaseModelForm
的源代码中,我无法立即清楚这一点)。
您可以修改 Django 提供的 ModelForm
和 Form
以满足您的需要。您可以根据需要覆盖每个方法。最基本和最重要的预填充是提供一个 initial
字典,其中包含表单接受的数据 {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 文档:Providing initial values
堆栈溢出:Pass initial value to a modelform in django