Хорошо, этот довольно очевиден для всех, кто использует Django и часто спрашивается новичками, но я ' Я хотел бы прояснить это и обсудить, есть ли другие способы сделать это. Наиболее распространенным и удобным подходом в настоящее время является хранение электронной почты в поле имени пользователя, поскольку Django 1.2 допускает символы «@», «_» и «-», но при этом возникают следующие проблемы:
max_length = 30
свойство, которое смехотворно мало для электронных писем. Даже если вы переопределите проверку формы, DB будет иметь varchar (30)
вместо EmailField
varchar (75)
, если вы не измените свою таблицу вручную. User.email_user ()
работал. Я думаю, что есть и другие места, когда используется User.email
. Дэвид Крамер придумал решение этой проблемы, которое мне очень нравится. В настоящее время я использую его на производственном сайте, где пользователь должен иметь возможность войти в систему, используя свой email ИЛИ свое имя пользователя. Вы можете найти его здесь:
Logging In With Email Addresses in Django
Если имя входа, указанное в форме, является электронным адресом (содержит символ '@'), он будет пытаться аутентифицироваться по нему, и вернется к имени пользователя, если это не электронный адрес. (Естественно, вам просто нужно убедиться, что ваша форма регистрации содержит email, чтобы это работало)
.Ну, мне не приходилось использовать электронную почту в качестве имени пользователя в Django, но я думаю, что вы можете создать модель UserProfile и агрегировать поля в ней, например, еще одно поле email и сделать его уникальным. Таким образом, вы можете сделать user.get_profile().email для вашей аутентификации.
Я думаю, что другим способом было бы наследовать User и переопределить поля, но я думаю, что это все еще не рекомендуется разработчиками Django.
Наконец, вы можете определить свою собственную пользовательскую модель User и опираться на django.contrib.auth.models.User для некоторой логики.
Код для изменения таблицы User в Django:
from django.db import connection
cursor = connection.cursor()
cursor.execute("ALTER TABLE auth_user MODIFY COLUMN username varchar(75) NOT NULL")