Django设计模式 - 用于创建和更新模型的表单

kil*_*ney 5 django django-models django-forms

假设我想创建和更新模型.显示哪些字段以及验证类型取决于操作(创建或更新).但他们仍然分享了许多相同的验证和功能.是否有一种干净的方法让ModelForm处理这个(除了实例存在于任何地方)或者我应该创建两个不同的模型形式?

Dan*_*man 4

我想到了两种可能性。您可以在表单的__init__方法中设置一个属性,可以基于您显式传入的参数,也可以基于是否self.instance存在且具有非 None pk:

class MyModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        # either:
        self.edit = kwargs.pop('edit', False)
        # or:
        self.edit = hasattr(self, instance) and self.instance.pk is not None
        super(MyModelForm, self).__init__(*args, **kwargs)
        # now modify self.fields dependent on the value of self.edit
Run Code Online (Sandbox Code Playgroud)

另一种选择是对模型形式进行子类化 - 将联合功能保留在基类中,然后将特定的创建或更新功能保留在子类中。