Электронная почта в качестве имени пользователя в Django

Хорошо, этот довольно очевиден для всех, кто использует Django и часто спрашивается новичками, но я ' Я хотел бы прояснить это и обсудить, есть ли другие способы сделать это. Наиболее распространенным и удобным подходом в настоящее время является хранение электронной почты в поле имени пользователя, поскольку Django 1.2 допускает символы «@», «_» и «-», но при этом возникают следующие проблемы:

  1. Самый худший: поле имени пользователя ограничено max_length = 30 свойство, которое смехотворно мало для электронных писем. Даже если вы переопределите проверку формы, DB будет иметь varchar (30) вместо EmailField varchar (75) , если вы не измените свою таблицу вручную.
  2. Вам необходимо сохранить данные электронной почты как в поле имени пользователя, так и в поле электронной почты, чтобы User.email_user () работал. Я думаю, что есть и другие места, когда используется User.email .
  3. Ошибка чтения кода. Конечно, что недопустимо, если вам нужно независимое от БД приложение.

19
задан Dmitry Gladkov 23 August 2010 в 11:20
поделиться

2 ответа

Дэвид Крамер придумал решение этой проблемы, которое мне очень нравится. В настоящее время я использую его на производственном сайте, где пользователь должен иметь возможность войти в систему, используя свой email ИЛИ свое имя пользователя. Вы можете найти его здесь:

Logging In With Email Addresses in Django

Если имя входа, указанное в форме, является электронным адресом (содержит символ '@'), он будет пытаться аутентифицироваться по нему, и вернется к имени пользователя, если это не электронный адрес. (Естественно, вам просто нужно убедиться, что ваша форма регистрации содержит email, чтобы это работало)

.
5
ответ дан 30 November 2019 в 05:15
поделиться

Ну, мне не приходилось использовать электронную почту в качестве имени пользователя в 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")
0
ответ дан 30 November 2019 в 05:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: