我正在为我的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的学生已经存在。" ) - 因为已经有一个人没有"无"作为他的身份证。
我有什么办法可以关闭“无”的验证,还是必须删除唯一约束?
谢谢, 托比
答案 0 :(得分:1)
您可以让多名学生使用anonymous_id=None
,问题是您的表单正在保存anonymous_id=''
。如果您使用ForeignKey
而不是CharField
,则Django将为您保存None
而不是空字符串,并验证ids链接到存在的对象。
如果您的表单在有和没有松散形式的情况下表现不同,我会感到惊讶。问题是你现在在数据库中有一个空字符串,所以你不能添加另一个字符串。
我建议使用ForeignKey
代替CharField
,或者在将表单保存到数据库之前检查ID并将空字符串更改为None。您还必须通过现有学生并将任何空字符串转换为无。