首页 > 解决方案 > 如何检测是否在 ModelForm.clean 中添加或编辑了 obj?

问题描述

无论用户是添加新对象还是更改现有对象,我都想以不同方式验证用户提交的数据。如果对象已经存在(如果它存在于 db 上,则正在添加),除了 id 之外没有模型的属性可以在 db 上检查。其他方法,比如save_model,传入了一个add参数,可以查看,但是modelform.clean中没有这个参数。如何在 modelform.clean 中进行验证?

MyModelForm(forms.ModelForm):
    def clean(self):
        if add :
            validation_A()
        else:
            validantion_B()

标签: pythondjangodjango-formsdjango-admindjango-validation

解决方案


在数据库级别不存在的对象有一个id(也许最好使用pk),即None(因为id是在数据库中插入时确定的,Django 不会分配该 id)。

所以我们可以检查是否self.instance.pk is None

MyModelForm(forms.ModelForm):

    def clean(self):
        if self.instance.pk is None:  # add
            validation_A()
        else:                         # edit
            validantion_B()

当然,上述方法可以被“欺骗”,因为在创建过程中传递对象之前,您可以设置idto None,但是Model.save(..)对象也使用这个事实来决定是执行INSERT INTO还是执行UPDATE


推荐阅读