我尝试为formset编写单元测试,但在尝试实例化时遇到以下错误。
错误:
class BingoSquareForm(ModelForm):
class Meta:
model = BingoCardSquare
exclude = ('created_date',)
BingoSquareFormset = inlineformset_factory(
BingoCard,
BingoCardSquare,
form=BingoSquareForm,
min_num=24,
validate_min=True,
max_num=24,
validate_max=True
)
这个错误说我错过了ManagmentForm数据,但是我将它包含在我传递给我的表单的字典中。我检查了不同的拼写并改变了最小和最大数字,但没有用。
forms.py:
class BingoSquareFormsetTests(TestCase):
def setUp(self):
self.user = User.objects.get_or_create(
username='FormsetTestUser',
email='something@yahoo.org'
)[0]
self.user.set_password('bingo')
self.user.save()
self.card = BingoCard.objects.get_or_create(
title='FormsetTest',
free_space='free_space',
creator=self.user,
)[0]
self.data = {
'form-TOTAL_FORMS': '24',
'form-INITIAL_FORMS': '0',
'form-MAX_NUM_FORMS': '24',
'form-MIN_NUM_FORMS': '24'
}
for i in range(24):
text_key = 'form-{}-text'.format(i)
text_value = 'square {}'.format(i)
self.data[text_key] = text_value
def test_formset_accepts_valid_data(self):
formset = BingoSquareFormset(self.data)
self.assertTrue(formset.is_valid())
tests.py
input
任何人都可以看到我做错了吗?
答案 0 :(得分:4)
此错误是由于未对formset的表单数据使用正确的前缀引起的。 Django的inlineformset_factory
自动将formset前缀设置为子模型上ForeignKeyField中定义的related_name
。
models.py:
class BingoCardSquare(models.Model):
...
card = models.ForeignKey(
BingoCard,
related_name='squares',
on_delete=models.CASCADE,
)
...
在这种情况下,self.data
属性应设置为以下内容:
self.data = {
'squares-TOTAL_FORMS': '24',
'squares-INITIAL_FORMS': '0',
'squares-MAX_NUM_FORMS': '24',
'squares-MIN_NUM_FORMS': '24'
}
每个附加表单都需要以相同的方式加上前缀。希望这个答案能够帮助未来的djangonaut陷入困境。