覆盖Django Crispy Forms的空“唯一”字段的表单验证

时间:2014-08-17 08:25:19

标签: django forms validation django-crispy-forms

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

对于我的学生数据库项目,每个学生都有一个设置为主键的student_id,每个学生还应该有一个anonymous_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,输入带有#34; anonymous_id"的空白字段的学生是没有问题的,但现在它向第二个学生抱怨("具有此匿名ID的学生已经存在。" ) - 因为已经有一个人没有"无"作为他的身份证。

我有什么办法可以关闭“无”的验证,还是必须删除唯一约束?

谢谢, 托比

1 个答案:

答案 0 :(得分:1)

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

如果您的表单在有和没有松散形式的情况下表现不同,我会感到惊讶。问题是你现在在数据库中有一个空字符串,所以你不能添加另一个字符串。

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