python - 在 Django View 中寻找 get_or _create 的良好示例用法并引发表单错误

标签 python django django-forms

我正在寻找一个很好的例子来说明如何实现以下目标:

我想使用 get_or_create 来检查数据库中是否已存在对象。如果没有,那么它将被创建。如果它确实存在,那么我将不会创建新对象,而是需要引发表单错误以通知用户他们需要输入不同的数据(例如,不同的用户名)。

该 View 包含:

p, created = Person.objects.get_or_create(
   email = registration_form.cleaned_data['email'],
   defaults = {
       'creationDate': datetime.datetime.now(),                
       'dateOfBirth': datetime.date(1970,1,1)
})

因此,“p”将包含现有的 Person(如果存在),如果不存在,则包含新的 Person。我想对“created”中的 bool 值进行操作,以便跳过保存人员并重新显示registration_form并引发适当的表单验证错误。

我正在考虑的替代方案是在自定义表单验证方法中进行检查,以查看提供的“电子邮件”字段中的数据是否存在,并仅引发验证错误。

最佳答案

这不是 get_or_create 的一个很好的用法示例。表单验证(您显然尝试这样做)在保存之前进行,并且这些根本不应该混合。您应该确保您的表单在保存之前经过验证,但“已存在”检查是验证的一部分。

在表单的 clean() 方法中,编写如下内容:

try:
    Person.objects.get(email=...)
    raise forms.ValidationError(...)
except Person.DoesNotExist:
    pass

这是您提出的替代方案,也是最明智的解决方案。

get_or_create 的良好用法例如是一个标记库,您希望在其中动态创建新标记或收集有关旧标记的信息,而不必一直编写 try/except 。

编辑:另外,如果您想这样做以避免稍后分离的获取/创建循环,请确保使用模型表单。 modelforms 的 save 方法返回刚刚创建的实例。

关于python - 在 Django View 中寻找 get_or _create 的良好示例用法并引发表单错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2628755/

相关文章:

python - PackageNotInstalledError : Package is not installed in prefix

python - 导入错误:没有名为 texttract 的模块

python - 在 Django 中访问同一数据库中的其他表

django - django 中的自定义身份验证不起作用

python - 在python中显示对象的属性

python - python可以控制itunes之类的应用吗?

css - 如何设置 Django 表单的样式 - bootstrap

django - 使用 django-angular 和 django-bootstrap3

python - django 1.7 makemigrations 需要我尝试删除的依赖项

python - 图像未在 Django 中更新