2017-10-18 6 views
0

フォームセットの単体テストを作成しようとしていますが、インスタンス化しようとすると次のエラーが表示されます。Django Formset管理フォームデータがありません

エラー:

Traceback (most recent call last): 
    File "/home/jwelborn/Documents/projects/Bingo/bingo/cards/tests/test_forms.py", line 218, in test_formset_accepts_valid_data 
     self.assertTrue(formset.is_valid()) 
    File "/home/jwelborn/Documents/projects/Bingo/bingoenv/lib/python3.6/site-packages/django/forms/formsets.py", line 321, in is_valid 
     self.errors 
    File "/home/jwelborn/Documents/projects/Bingo/bingoenv/lib/python3.6/site-packages/django/forms/formsets.py", line 295, in errors 
     self.full_clean() 
    File "/home/jwelborn/Documents/projects/Bingo/bingoenv/lib/python3.6/site-packages/django/forms/formsets.py", line 343, in full_clean 
     for i in range(0, self.total_form_count()): 
    File "/home/jwelborn/Documents/projects/Bingo/bingoenv/lib/python3.6/site-packages/django/forms/formsets.py", line 116, in total_form_count 
     return min(self.management_form.cleaned_data[TOTAL_FORM_COUNT], self.absolute_max) 
    File "/home/jwelborn/Documents/projects/Bingo/bingoenv/lib/python3.6/site-packages/django/utils/functional.py", line 35, in __get__ 
     res = instance.__dict__[self.name] = self.func(instance) 
    File "/home/jwelborn/Documents/projects/Bingo/bingoenv/lib/python3.6/site-packages/django/forms/formsets.py", line 98, in management_form 
     code='missing_management_form', 
    django.core.exceptions.ValidationError: ['ManagementForm data is missing or has been tampered with'] 

このエラーは、私がManagmentFormデータを欠けていると言うが、私は自分のフォームに渡している辞書に含めます。私は別のスペルを確認し、最小値と最大値を変えて、役に立たない。

forms.py:

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 
) 

tests.py

class BingoSquareFormsetTests(TestCase): 

    def setUp(self): 

     self.user = User.objects.get_or_create(
      username='FormsetTestUser', 
      email='[email protected]' 
     )[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()) 

誰もが私が間違ってやっているかを見ることができますか?

答えて

0

このエラーは、フォームセットのフォームデータに適切なプレフィックスを使用していないために発生しています。 Djangoのinlineformset_factoryは、子モデルのForeignKeyFieldに定義されているrelated_nameにformset接頭辞を自動的に設定します。

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' 
    } 

各追加のフォームが同じように前置される必要があるであろう。うまくいけば、この答えは苦痛を伴う将来のジャンゴナウトを助けるでしょう。

関連する問題