Django Formset缺少管理表单数据

时间:2017-10-18 19:05:56

标签: python django unit-testing testing

我尝试为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

任何人都可以看到我做错了吗?

1 个答案:

答案 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陷入困境。