Python 编辑时如何仅调用验证方法的子集

Python 编辑时如何仅调用验证方法的子集,python,django,django-forms,Python,Django,Django Forms,在我的Django应用程序中,我使用了一个模型(我们称之为Mymodel)和一个表单: class Mymodel(models.Model): firstField(...) secondField(...) class MymodelAddform(ModelForm): def clean_firstField(self): #stuff def clean_secondField(self): #stuff again

在我的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
验证

我考虑过两个选项(两个选项都不适用于我编写的选项):

这里的问题是除非我重新定义它,否则不会调用
clean_secondField
,我希望避免让
clean_secondField
调用其他地方定义的另一个方法(尽管,如果它是唯一的选项,就这样吧)

这里的问题是调用了clean()验证,因为我只使用了字段的一个子集,所以它失败了


问题很明显:我如何才能使它按预期工作?

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

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

class MymodelformCleaner(ModelForm):
    def clean_firstField(self):
        #stuff
    def clean_secondField(self):
        #stuff again
  • 从此类继承模型表单
您的模型表单将只定义字段,而clean方法来自另一个类

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

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

一个显而易见的解决方案是在
MymodelEditform
中定义
clean_secondField
,并使
MyModelAddForm
继承
MymodelEditform
,但它可能无法按预期工作。另一个解决方案是使两个表单都从定义clean_secondField的公共基表单继承


或者你可以明确地排除表单Meta(cf)

中的字段。好吧,我看不出与我展示的第二个选项有什么区别:所有验证方法都将被调用,而不仅仅是与
secondField
相关的验证方法。不,我不认为。按照您的方式,您是从包含所有字段的
MymodelAddform
派生的,并且可能会为这些字段调用clean。您可能需要检查
Meta
类如何与继承一起工作。在我的例子中,第二个表单只有一个字段,所以应该只调用它的clean方法。显式指定要包含的字段已经完成了您的建议(它只调用与您包含的字段相关的验证方法)。但我没有对我遇到的问题进行足够的测试,这让你感到困惑。我已经编辑了我的问题(实际上,还有另一个clean()方法)@LogIn,在这种情况下,我建议只在
MymodelAddform
中定义
clean
方法,而不是
MymodelformCleaner
。我确实排除了表单元中的字段,但我刚刚注意到我还声明了一个clean()方法,该方法使用模型中的大多数字段。正是这个clean()方法破坏了这个东西(而不是像我一开始所想的那样,clean_firstfield)。当我让editform从addform继承时,有没有办法不包含它?正如您所说,其他解决方案是显而易见的,但它需要将代码放在不同的位置,这些代码(IMO)应该放在同一个位置。。。哦,等等
form.clean_XXX
实际上是TemplateMethod模式的一个实现。为什么不使用它并将您的
secondField
的验证逻辑放在“clean\u secondField”中?更严肃地说:你有任何理由使用两种不同的形式吗?除了隐藏几个字段,我是说?secondField的整个验证逻辑已经在clean_secondField中了。问题是调用了clean()方法,这个方法按照django的doc()建议的方式对其他字段执行验证。不,除了隐藏大部分字段之外,我没有其他理由使用两种不同的形式。但我认为这是唯一的方法:没有两种形式,我怎么能做到这一点?
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']