测试InlineFormset的清洁方法 [英] Testing InlineFormset clean methods

查看:146
本文介绍了测试InlineFormset的清洁方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Django项目,有2个模型,一个结构支架,支架有一个ForeignKey一个结构(即一对多,一个结构有许多支架)。我为管理站点创建了一个 TabularInline ,以便在结构上有一个括号表。我添加了一些自定义表单集,其中包含一些定制的 clean 方法来进行一些额外的验证,您不能在同一结构等上与其他括号冲突。 p>

管理员看起来像这样:

  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):
...我的干净的代码在这里...

所有的工作,验证工作。



然而,现在我想写一些单元测试来测试我的复杂的formset验证逻辑。



我的第一次尝试验证已知的好值是:

  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())

但是这不起作用并引发异常:

  ============================ ==================================== 
错误:testValid(appname.tests。 StructureTestCase)
-------------------------------------------- --------------------------
追溯(最近最近通话):
文件/ paht / to / project /tests.py,第494行,testValid
formset = BracketInlineFormset(data)
文件/path/to/django/forms/models.py,第672行,__init__
self.instance = self.fk.rel.to()
AttributeError:'BracketInlineFormset'对象没有属性'fk'

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

Django文档(用于表单验证)意味着可以做到这一点。



这是怎么回事?如何测试我的内联表单的自定义clean()/验证?

解决方案

可以使用django中的inlineformset_factory方法。 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文件


I have a Django project, with 2 models, a Structure and Bracket, the Bracket has a ForeignKey to a Structure (i.e. one-to-many, one Structure has many Brackets). I created a TabularInline for the admin site, so that there would be a table of Brackets on the Structure. I added a custom formset with some a custom clean method to do some extra validation, you can't have a Bracket that conflicts with another Bracket on the same Structure etc.

The admin looks like this:

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

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

The BracketInlineFormset just has the clean method:

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

That all works, and the validation works.

However now I want to write some unittest to test my complex formset validation logic.

My first attempt to validate known-good values is:

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())

However that doesn't work and raises the exception:

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

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

The Django documentation (for formset validation) implies one can do this.

How come this isn't working? How do I test the custom clean()/validation for my inline formset?

解决方案

You can use the inlineformset_factory method from django.forms.models to create a custom inline formset. This method sets the fk value to your formset based on the parent class passed on to it.

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())

Note the formset=BracketInlineFormset parameter while constructing the formset with the factory.

Reference: Django Docs

这篇关于测试InlineFormset的清洁方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆