验证ModelForm而不检查重复项

时间:2019-11-06 14:45:09

标签: python django

我正在尝试在django中编写一个视图,该视图检查客户端是否存在,然后不执行任何操作。如果它不存在,那么我创建。

这是ModelForm的样子:

class FacebookLoginForm(ModelForm):
    class Meta:
        model = Client
        fields = ['facebook_id', 'first_name', 'last_name', 'email']

这是我的代码:

def facebook_login(request):
    data = json.loads(request.body)
    form = FacebookLoginForm(data)

    if form.is_valid():
       # do something
       pass

但是由于某种原因,当我在表单上调用is_valid时,它会检查所传递的数据在数据库中不存在(模型字段是唯一的)。如何设置ModelForm仅验证数据而不检查数据是否已存在?我的最终目标是验证表单的输入,然后更新/创建数据库。

1 个答案:

答案 0 :(得分:0)

如果您想坚持使用ModelForm,可以重写validate_unique方法,如下所示:

def validate_unique(self):
    """
    Calls the instance's validate_unique() method and updates the form's
    validation errors if any were raised.
    """
    exclude = self._get_validation_exclusions()
    try:
        self.instance.validate_unique(exclude=exclude)
    except ValidationError as e:
        self._update_errors(e)

但是,您最好只创建一个常规表单,因为它可以很好地满足您的目的。在这种情况下,覆盖validate_unique函数将不是更干净的代码IMO。

编辑: 更好的解决方案是在不调用super的情况下覆盖clean方法。从BaseModelForm __init__方法的源代码中:

    # self._validate_unique will be set to True by BaseModelForm.clean().
    # It is False by default so overriding self.clean() and failing to call
    # super will stop validate_unique from being called.

这实际上就是您的表单的外观:

class FacebookLoginForm(ModelForm):
    class Meta:
        model = Client
        fields = ['facebook_id', 'first_name', 'last_name', 'email']

    def clean(self):
        return self.cleaned_data