当行已存在时,ModelForm.is_valid()为False。如何获得对象?

时间:2017-02-05 06:10:46

标签: django django-models django-forms

我的位置模型有一个名为名称的唯一字段。通过LocationForm我得到用户输入并尝试将其插入数据库或获取axisting对象。但是如果用户输入现有名称,则lf.is_valid()变为False,并且我从未进入get_or_create命令。知道我怎么能通过这个吗?

lf = LocationForm(request.POST or None)
if lf.is_valid():
    location_instance, created = Location.objects.get_or_create(**lf.cleaned_data)

谢谢,

2 个答案:

答案 0 :(得分:0)

如果您正在使用ModelForm,那么您可以尝试覆盖_get_validation_exclusions方法。

https://github.com/django/django/blob/8838d4dd498c8f66ea4237fe8a79a5f77d6f95c9/django/forms/models.py#L297

class LocationForm():
    def _get_validation_exclusions(self):
        exclude = super(LocationForm, self)._get_validation_exclusions()
        exclude.append(self.fields['name'])
        return exclude

让我知道这是怎么回事......

答案 1 :(得分:0)

感谢您的想法。 我在Django文档中找到了有用的.is_valid描述。 Django Validating Objects
显然 .is_valid 也会针对 Model.validate_unique()进行检查。 这是我最终做的事情:

if lf.is_valid():
     location_instance = lf.save()
     return render (...)

else:
    location_instance, created = Location.objects.get_or_create(**lf.cleaned_data)
    error_msg = lf.errors["__all__"]            
    return render(...)