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

2024-10-01 13:40:44 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的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()验证被调用,因为我只使用字段的一个子集,所以它失败了

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


Tags: selfclean表单fieldsmodeldef选项meta
2条回答

我没做过,但你可以试试

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

如下所示

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

一个显而易见的解决方案是在MymodelEditform中定义clean_secondField,并使MyModelAddFormMymodelEditForm继承,但它可能无法按预期工作。另一种解决方案是使这两个窗体都继承定义clean\u secondField的公共基窗体

或者您可以直接排除表单元中的字段(cfhttps://code.djangoproject.com/ticket/12901

相关问题 更多 >