2013-04-17 29 views
0

当在我的Django应用程序如何调用只有验证方法的子集,我使用的模型(我们称之为基于myModel),以及一种形式:编辑工作

class Mymodel(models.Model): 
    firstField(...) 
    secondField(...) 

class MymodelAddform(ModelForm): 
    def clean_firstField(self): 
     #stuff 

    def clean_secondField(self): 
     #stuff again 

    def clean(self): 
     #performs stuff with all the fields 

    class Meta: 
     model = Mymodel 

现在我想添加另一种形式, MymodelEditform的基础上,为MyModel再次,只用secondField,只有secondField验证

两个选项,我认为(我写他们两个不工作):

class MymodelEditform(ModelForm): 
    class Meta: 
     model = Mymodel 
     fields = ['secondField'] 

这里的问题是,clean_secondField不叫,除非我重新定义它,我想,以避免clean_secondField电话上定义的另一个方法(不过,如果它是唯一的选择,就这样吧)

class MymodelEditform(MymodelAddform): 
    class Meta: 
     model = Mymodel 
     fields = ['secondField'] 

这里的问题是调用clean()验证,并且由于我只使用了字段的一个子集,所以失败了。

这个问题很明显:我如何让它按预期工作?

回答

0

我还没有这样做,但你可以试试这个。

  • 用干净的方法创建一个简单的类。

如下

class MymodelformCleaner(ModelForm): 
    def clean_firstField(self): 
     #stuff 
    def clean_secondField(self): 
     #stuff again 
  • 从该类继承你的模型形式

您的模型的形式将只定义字段,而清洁的方法是从另一个类

class MymodelAddform(ModelForm, MymodelformCleaner): 
    class Meta: 
     model = Mymodel 

class MymodelEditform(ModelForm, MymodelformCleaner): 
    class Meta: 
     model = Mymodel 
     fields = ['secondField'] 
+0

好吧,我没有看到第二个选项我展示的区别是:所有的验证方法总会被调用,而不仅仅是与'secondField'有关的一些# –

+0

不,我不这么认为。按照你的方式,你从'MymodelAddform'派生出来,它具有所有的字段,并且可能对这些字段调用干净。你可能想要检查'Meta'类如何与继承一起工作。在我的情况下,第二种形式只有一个字段,所以应该只调用其干净的方法。 – Rohan

+0

明确指定要包含的字段已经做了你所建议的(它只调用与你包含的字段相关的验证方法)。但是我没有对我遇到的问题进行足够的测试,使我感到困惑。我编辑了我的问题(实际上,还有另一个clean()方法) –

0

一个明显的解决方案wo应该定义clean_secondFieldMymodelEditform中并且使MyModelAddForm继承自MymodelEditForm,但它可能无法按预期工作。另一个解决方案是使这两个表单都从定义clean_secondField的通用基本形式继承。

或者你可以明确地排除在窗体的元场(CF https://code.djangoproject.com/ticket/12901

+0

我的确在表单的meta中排除了字段,但我只注意到我还声明了一个使用我的模型中大多数字段的clean()方法。正是这种干净()方法打破了事情(而不是,正如我首先想到的那样,clean_firstfield)。有没有办法不包括它,当我从addform继承editform?正如你所说,其他解决方案显而易见,但它需要在不同的地方放置应该(IMO)在同一地点的代码。 –

+0

通常的解决方案是TemplateMethod模式......哦,等等......'form.clean_XXX'实际上是TemplateMethod模式的一个实现。为什么不使用它并将'secondField'的验证逻辑放在'clean_secondField'中? 更严重:你有什么理由使用两种不同的形式?我的意思是除了隐藏几个字段? –

+0

secondField的整个验证逻辑已经在clean_secondField中。问题在于调用了clean()方法,并且这个方法按照django的文档建议的方式执行其他字段的验证(https://docs.djangoproject.com/en/1.5/ref/forms/validation/#清洁和验证领域 - 相互依赖)。不,除了隐藏大部分字段之外,我没有其他理由使用两种不同的形式。但我认为这是唯一的方法:我怎么能没有两种形式呢? –