2012-11-21 6 views
5

私はDjangoプロジェクトを持っています。モデルはStructureBracketです。ブラケットは構造体への外部キーを持ちます(つまり、1対多、1つの構造体には大括弧があります)。私は、管理サイトのためにTabularInlineを作成しました。そのため、構造上に括弧のテーブルがあります。私は、あなたが同じ構造上の別のブラケットと競合するブラケットを持つことができないいくつかの余分な検証を行うにはいくつかのカスタムclean方法でフォームセットのカスタムを追加などInlineFormsetのクリーンメソッドのテスト

管理者は、次のようになります。

class BracketInline(admin.TabularInline): 
    model = Bracket 
    formset = BracketInlineFormset 

class StructureAdmin(admin.ModelAdmin): 
    inlines = [ 
     BracketInline 
    ] 
admin.site.register(Structure, StructureAdmin) 

そのすべての作品、および検証作品:

BracketInlineFormsetはちょうどきれいな方法があります。

しかし、今では複雑なformset検証ロジックをテストするためにunittestを書いてみたいと思います。動作しません。しかし

data = {'form-TOTAL_FORMS': '1', 'form-INITIAL_FORMS': '0', 'form-MAX_NUM_FORMS': '', 'form-0-field1':'good-value', … } 
formset = BracketInlineFormset(data) 
self.assertTrue(formset.is_valid()) 

と例外発生します:既知の良好な値を検証する

私の最初の試みである

====================================================================== 
ERROR: testValid (appname.tests.StructureTestCase) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/paht/to/project/tests.py", line 494, in testValid 
    formset = BracketInlineFormset(data) 
    File "/path/to/django/forms/models.py", line 672, in __init__ 
    self.instance = self.fk.rel.to() 
AttributeError: 'BracketInlineFormset' object has no attribute 'fk' 

---------------------------------------------------------------------- 

Django documentation(フォームセットの検証のために)1ができる意味をこれを行う。

どうしてこれが機能しないのですか?インラインformsetのカスタムclean()/ validationをテストするにはどうすればよいですか?

+0

何BracketInlineFormsetの宣言は次のようになりますか? –

+0

@JohnMeeインラインフォームセットコードが質問に追加されました – Rory

答えて

4

django.forms.modelsのinlineformset_factoryメソッドを使用して、カスタムインラインフォームセットを作成できます。このメソッドは、渡された親クラスに基づいてformsetにfk値を設定します。工場でフォームセットを構築しながら、

structure = StructureFactory() #foreign key 
data = {'form-TOTAL_FORMS': '1', 'form-INITIAL_FORMS': '0', 'form-MAX_NUM_FORMS': '', 'form-0-field1':'good-value', … } 
BIFormset = inlineformset_factory(Structure, Bracket, formset=BracketInlineFormset) 
formset = BIFormset(data, prefix='form', instance=structure) 
self.assertTrue(formset.is_valid()) 

formset=BracketInlineFormsetパラメータに注意してください。

参考:Django Docs

関連する問題