Имя пользователя без учета регистра в форме регистрации Django - PullRequest
0 голосов
/ 13 января 2019

Вот моя регистрационная форма,

class SignupForm(forms.ModelForm):

   class Meta:
       model = User
       fields = ['first_name', 'last_name','username', 'email', 'password']

    def clean_username(self):
        username = self.cleaned_data.get('username')
        email = self.cleaned_data.get('email')

        if username and User.objects.filter(username=username).exclude(email=email).count():
            raise forms.ValidationError('This username has already been taken!')
       return username

Это хорошо работает, чтобы проверить, присутствует ли одно и то же имя пользователя или нет. Однако он не проверяет регистронезависимость. Если есть имя пользователя, например «userone», то он также принимает имя пользователя с «Userone». Хотя это не нарушает никакой функциональности, но выглядит очень непрофессионально.

Мой вопрос: как я могу проверить право на регистр без учета регистра и вывести ошибку?

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Иногда я сталкивался с той же проблемой. Джанго считает уникальным имя пользователя в нижнем или верхнем регистре. Например, если я введу John, это уникальное имя пользователя, а если я введу john, это новое имя пользователя. Мне нужно учитывать John и john не в базе данных. Как и в Facebook, имя пользователя в верхнем и нижнем регистре одно и то же, уникальное.

Так что я достигаю этого, просто меняя код регистрации следующим образом.

username = self.cleaned_data.get('username').lower()

Кроме того, в своем коде входа я преобразую свое имя пользователя в более низкое. Чтобы все время сохранять имя пользователя ниже в базе данных и входить в систему с именем пользователя в нижнем регистре. Хотя пользователь пытается войти в систему с именем пользователя в верхнем регистре, он сохраняет данные в базе данных путем преобразования в нижний регистр.

0 голосов
/ 13 января 2019

Вы можете использовать __ iexact здесь:

User.objects.filter(username__iexact=username).exclude(email=email).exists()  # instead of count, used exists() which does not make any DB query
...