【问题标题】:Overriding form validation for empty "unique" field for Django Crispy Forms覆盖 Django Crispy Forms 的空“唯一”字段的表单验证
【发布时间】:2014-10-10 10:25:19
【问题描述】:

我正在为我的 Django 项目使用清晰的表单,在我使用的其中一个表单中,有一个字段在输入时需要是唯一的,但也应该可以将其留空。

对于我的学生数据库项目,每个学生都有一个设置为主键的 student_id,每个学生还应该有一个将在今年晚些时候添加的 anonymous_id。此考试 ID 应该是唯一的,以防止管理员为错误的学生输入它。非常简化,模型如下所示:

class Student(models.Model):
    student_id = models.CharField(primary_key=True)
    anonymous_id = models.CharField(null=True, blank=True, unique=True, default=None)
    ...

并且表单只是在选项卡中列出了这两个字段。如果没有 Crispy Forms,在“anonymous_id”的空白字段中输入学生是没有问题的,但现在它会向第二个学生抱怨(“具有此匿名 ID 的学生已经存在。”)-大概是因为已经有一个“没有”作为他的 ID。

我可以做些什么来关闭仅对 None 的验证,或者我必须删除唯一约束吗?

谢谢, 托比

【问题讨论】:

标签: django forms validation django-crispy-forms


【解决方案1】:

anonymous_id=None 可以有多个学生,问题是您的表单正在保存anonymous_id=''。如果您使用 ForeignKey 而不是 CharField,那么 Django 将为您保存 None 而不是空字符串,并验证 id 是否链接到存在的对象。

如果您的表单在使用和不使用酥脆表单时表现不同,我会感到惊讶。问题是你现在在数据库中有一个空字符串,所以你不能添加另一个。

我建议使用ForeignKey 而不是CharField,或者在将表单保存到数据库之前检查 id 并将空字符串更改为 None。您还必须检查现有学生并将任何空字符串转换为无。

【讨论】:

  • 谢谢!会做第二个想法。而且我现在意识到将表单更改为脆不是我唯一做的事情 - 在以前的版本中我也没有匿名 ID 字段。所以我想你是对的,脆的形式不应该归咎于此。
猜你喜欢
  • 2015-08-06
  • 2018-07-22
  • 2020-03-25
  • 2019-12-31
  • 2022-01-04
  • 1970-01-01
  • 2018-02-10
  • 2021-05-29
  • 2014-12-21
相关资源
最近更新 更多