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

Overriding form validation for empty “unique” field for Django Crispy Forms

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

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

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

表单只列出选项卡中的两个字段。如果没有清晰的表格,用空白字段输入"匿名学生ID"是没有问题的,但是现在它向第二个学生投诉("拥有匿名学生ID的学生已经存在")-假设,因为已经有一个学生的ID为"无"。

是否有什么我可以做的来关闭仅对"无"的验证,或者我必须删除唯一约束?

谢谢,托比


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

如果你的形体在有或没有脆的形体时表现不同,我会很惊讶的。问题是,现在数据库中有一个空字符串,因此不能添加其他字符串。

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