Хорошо, это довольно очевидно для всех, кто использует Django и часто спрашивает новичков, но я хотел бы дать понять и обсудить, есть ли другие способы сделать это. Самый распространенный и удобный подход - хранить электронную почту в поле имени пользователя, так как Django 1.2 допускает символы "@", "_" и "-", но этот способ имеет следующие проблемы:
- Самое худшее: поле имени пользователя ограничено свойством
max_length=30
, что является смехотворным для электронных писем. Даже если вы переопределите проверку формы, у DB будетvarchar(30)
вместоEmailField
varchar(75)
, если вы не измените свою таблицу вручную. - Вам необходимо сохранить данные электронной почты как в поле имени пользователя, так и в поле электронной почты, чтобы сделать работу
User.email_user()
. Я думаю, что есть другие места, когда используетсяUser.email
. - Считывание кода невозможно. Конечно, другие джангонауты знают об этой ловушке, но рассматривают поле под названием "имя пользователя" (особенно когда есть еще поле электронной почты), поскольку электронная почта явно делает ваш код менее понятным.
Другим подходом может быть аутентификация с использованием поля email
, передавая его на ваш бэкэнд так, как это было, но у него все еще есть проблемы:
authenticate(self, email=None, password=None)
-
User.email
не имеет свойстваunique=True
, что означает, что ваша БД не будет иметь индекс, что делает ваш поиск по электронной почте медленным, как ад. - Вам нужно иметь дело с полем
username
, которое имеетunique=True
, полностью удалив его из вашей таблицы или изменив его, чтобы разрешить NULL и удалить индекс.
Возобновление, оба способа являются злыми и требуют, чтобы конкретный DB-код выполнялся после syncdb, что неприемлемо, если вам нужно независимое от БД приложение.