覆盖空“的表单验证”;独特的;Django脆饼的字段

覆盖空“的表单验证”;独特的;Django脆饼的字段,django,forms,validation,django-crispy-forms,Django,Forms,Validation,Django Crispy Forms,我正在为Django项目使用crispy表单,在我正在使用的表单中,有一个字段在输入时需要是唯一的,但也可以将其留空 对于我的学生数据库项目,每个学生都有一个设置为主键的学生id,每个学生还应该有一个匿名id,该id将在今年晚些时候添加。此考试ID应该是唯一的,以阻止管理员为错误的学生输入它。非常简化,模型如下所示: class Student(models.Model): student_id = models.CharField(primary_key=True) anony

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

对于我的学生数据库项目,每个学生都有一个设置为主键的学生id,每个学生还应该有一个匿名id,该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)
    ...
表单只是在一个选项卡中列出这两个字段。如果没有清晰的表格,输入带有空白字段的“匿名id”的学生是没有问题的,但现在它向第二个学生抱怨(“已经存在这个匿名id的学生”)——这可能是因为已经有一个学生的id为“无”

我可以做些什么来关闭“无”验证,还是必须删除唯一约束

谢谢,
Tobi

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

如果您的表单在使用和不使用脆表单时表现不同,我会感到惊讶。问题是,现在数据库中有一个空字符串,因此无法添加其他字符串


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

您是否检查了此解决方案?谢谢我会做第二个主意。我现在意识到,将表单更改为crispy并不是我唯一做的事情——在以前的版本中,我也没有匿名ID字段。所以我想你是对的,这里不应该怪脆饼。