-->

测试InlineFormset清洁方法(Testing InlineFormset clean me

2019-08-03 01:33发布

我有一个Django项目,有2个型号,一个StructureBracket ,支架有一个ForeignKey的结构(即一对许多人来说,一个结构有许多支架)。 我创建了一个TabularInline的管理站点,以便有将是对结构支架的表。 我加了一些自定义表单集自定义clean方法做一些额外的验证,你不能有与上相同的结构等其他支架相冲突的支架

管理是这样的:

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

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

BracketInlineFormset只是有干净的方法:

class BracketInlineFormset(forms.models.BaseInlineFormSet):
    def clean(self):
        … my clean code here …

这所有的作品,和验证工作。

不过现在我想写一些单元测试来测试我的复杂的表单集验证逻辑。

我的第一个验证已知的良好价值观的尝试是:

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文档 (对于表单集验证)意味着我们可以做到这一点。

为什么这是不工作? 如何测试我的在线表单集自定义清洁()/验证?

Answer 1:

您可以使用inlineformset_factory方法从django.forms.models创建一个自定义在线表单集。 此方法设置基于传递给它的父类的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文档



文章来源: Testing InlineFormset clean methods