Как сохранить 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() присутствовала во многих других местах: при выполнении запросов, удалении логики, представлениях, использующих различные формы (например, ваше представление входа!), и т.д.

Вернуться на верх