在不检查dupli的情况下验证ModelForm

2024-06-16 11:48:43 发布

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

我试图在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以只验证数据而不检查数据是否已经存在?我的最终目标是验证表单的输入,然后更新/创建数据库


Tags: 数据djangonameform视图数据库表单data
1条回答
网友
1楼 · 发布于 2024-06-16 11:48:43

如果您想继续使用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函数并不是更干净的代码

编辑: 更好的解决方案是重写clean方法而不调用super。从BaseModelForm{}方法中的源代码:

    # 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

相关问题 更多 >