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

时间:2013-04-17 12:33:37

标签: 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

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

    class Meta:
        model = Mymodel

现在我想再次基于Mymodel添加另一个表单MymodelEditform,仅使用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()验证,因为我只使用了字段的子集,所以它失败了。

问题非常明显:我怎样才能让它按预期工作?

2 个答案:

答案 0 :(得分: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']

答案 1 :(得分:0)

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

或者您可以明确地排除表格中的字段(参考https://code.djangoproject.com/ticket/12901