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() 验证,并且由于我只使用了字段的子集,所以它失败了。

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

4

2 回答 2

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']
于 2013-04-17T12:46:57.420 回答
0

一个明显的解决方案是定义clean_secondFieldinMymodelEditform和 make MyModelAddForminherit from MymodelEditForm,但它可能无法按预期工作。另一种解决方案是让两个表单都继承自定义 clean_secondField 的通用基本表单。

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

于 2013-04-17T13:03:18.730 回答