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