Как сохранить email в нижнем регистре в django при регистрации пользователя?
Я хочу перевести электронную почту в нижний регистр при регистрации нового пользователя, я пробовал сделать это с помощью метода lower()
, но это не приводит к автоматической регистрации пользователя с помощью функции login()
. Может быть, я делаю это неправильно?
Как правильно этого достичь?
NOTE: Я бы опубликовал полный код
Вы пробовали
user = authenticate(username=username.lower(), password=password)
login(request, user)
Вы должны написать его в нижнем регистре, чтобы система авторизации могла найти уже написанный в нижнем регистре email, который вы сохранили при регистрации.
В противном случае, попробуйте использовать casefold()
вместо lower()
на электронной почте при входе и регистрации
Но сначала попробуйте первое решение.
Подробнее о методе casefold()
здесь https://www.w3schools.com/python/ref_string_casefold.asp
Стоит отметить, что, хотя большинство провайдеров электронной почты делают адреса нечувствительными к регистру, это не гарантируется. Поэтому если вы напишете письмо в нижнем регистре, есть небольшой шанс, что вы не сможете отправить письмо пользователю (или, что еще хуже, отправите его непредусмотренному получателю).
Если вы все же хотите приступить к этому, вы, вероятно, захотите сделать это на уровне данных (на уровне модели), но вы также можете сделать это в валидации формы. Я рассмотрю оба подхода:
Использование модели вашей базы данных
Есть несколько способов реализовать это в вашей модели. Один из способов - реализовать пользовательское поле, которое реализует get_prep_value
. get_prep_value
принимает объекты Python и подготавливает их для использования в запросе к БД. Поэтому для всех случаев (запрос, вставка, удаление и т.д.) будет применяться ваша логика с нижним регистром.
class LowercaseCharField(models.CharField):
def get_prep_value(self, value):
return str(value).lower()
Вы также можете реализовать собственный метод save
, но это может пропустить несколько случаев, когда save
не вызывается, например, при использовании .update
.
Преимущество этого подхода в том, что вам нужно определить эту логику только один раз, и она должна работать везде, где используется ваша модель (поле).
Использование валидации формы
Вы можете реализовать метод clean
или clean_<fieldname>
в вашем UserRegisterForm
для изменения значения на строчное. В целом, переопределение методов формы является лучшим способом реализации валидации и очистки формы (не в вашей логике представления).
class UserRegisterForm(ModelForm):
...
def clean_email(self):
email = self.cleaned_data['email']
return email.lower()
Однако этот подход не так хорош, потому что вам, скорее всего, понадобится, чтобы эта логика .lower()
присутствовала во многих других местах: при выполнении запросов, удалении логики, представлениях, использующих различные формы (например, ваше представление входа!), и т.д.