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