Переопределение проверки формы для пустого уникального поля для Django Crispy Forms

Я использую прозрачные формы для своего проекта Django, и в одной из форм, которые я использую, есть поле, которое должно быть уникальным при вводе, но также должно быть возможно оставить его пустым.

В моем проекте базы данных студентов у каждого студента есть student_id, установленный в качестве первичного ключа, и у каждого студента также должен быть anonymous_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", но теперь он жалуется на второго студента ("Студент с этим анонимным идентификатором уже существует.") - предположительно, потому что уже есть тот, у кого есть " Нет "в качестве его удостоверения личности.

Могу ли я что-нибудь сделать, чтобы отключить проверку только для None, или мне придется удалить уникальное ограничение?

Спасибо, Тоби


person Tobi    schedule 17.08.2014    source источник
comment
Вы проверяли это решение? stackoverflow.com / questions / 454436 /   -  person Sudip Kafle    schedule 17.08.2014


Ответы (1)


У вас может быть несколько студентов с anonymous_id=None, проблема в том, что ваша форма сохраняет anonymous_id=''. Если вы используете ForeignKey вместо CharField, то Django сохранит для вас None вместо пустой строки и подтвердит, что идентификаторы ссылаются на существующий объект.

Я был бы удивлен, если бы ваша форма вела себя по-другому с хрустящими формами и без них. Проблема в том, что теперь у вас есть пустая строка в базе данных, поэтому вы не можете добавить другую.

Я бы предложил использовать ForeignKey вместо CharField или проверить идентификаторы и изменить пустые строки на None перед сохранением вашей формы в db. Вам также нужно будет просмотреть своих существующих студентов и преобразовать все пустые строки в None.

person Alasdair    schedule 17.08.2014
comment
Спасибо! Сделаем вторую идею. И теперь я понял, что изменение форм на хрустящие - не единственное, что я сделал - у меня также не было поля анонимного идентификатора в предыдущей версии. Так что, думаю, вы правы, что здесь не виноваты хрустящие формы. - person Tobi; 17.08.2014