[4.2.x] Fixed #34438 -- Reallowed extending UserCreationForm.

Regression in 298d02a77a.

Backport of fcc7dc5781 from main
This commit is contained in:
Gary Jarrel 2023-03-27 23:26:06 +11:00 committed by Mariusz Felisiak
parent 788f7b8100
commit 99ba5b43f0
3 changed files with 46 additions and 11 deletions

View File

@ -147,16 +147,22 @@ class BaseUserCreationForm(forms.ModelForm):
class UserCreationForm(BaseUserCreationForm):
error_messages = {
**BaseUserCreationForm.error_messages,
"unique": _("A user with that username already exists."),
}
def clean_username(self):
"""Reject usernames that differ only in case."""
username = self.cleaned_data.get("username")
if username and User.objects.filter(username__iexact=username).exists():
raise forms.ValidationError(self.error_messages["unique"], code="unique")
if (
username
and self._meta.model.objects.filter(username__iexact=username).exists()
):
self._update_errors(
ValidationError(
{
"username": self.instance.unique_error_message(
self._meta.model, ["username"]
)
}
)
)
else:
return username

View File

@ -77,10 +77,6 @@ msgstr ""
msgid "Enter the same password as before, for verification."
msgstr ""
#: contrib/auth/forms.py:152 contrib/auth/models.py:353
msgid "A user with that username already exists."
msgstr ""
#: contrib/auth/forms.py:168
msgid ""
"Raw passwords are not stored, so there is no way to see this users "
@ -240,6 +236,10 @@ msgstr ""
msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only."
msgstr ""
#: contrib/auth/models.py:353
msgid "A user with that username already exists."
msgstr ""
#: contrib/auth/models.py:356
msgid "first name"
msgstr ""

View File

@ -372,6 +372,35 @@ class UserCreationFormTest(TestDataMixin, TestCase):
["A user with that username already exists."],
)
@override_settings(AUTH_USER_MODEL="auth_tests.ExtensionUser")
def test_case_insensitive_username_custom_user_and_error_message(self):
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = ExtensionUser
fields = UserCreationForm.Meta.fields + ("date_of_birth",)
error_messages = {
"username": {"unique": "This username has already been taken."}
}
ExtensionUser.objects.create_user(
username="testclient",
password="password",
email="testclient@example.com",
date_of_birth=datetime.date(1984, 3, 5),
)
data = {
"username": "TeStClIeNt",
"password1": "test123",
"password2": "test123",
"date_of_birth": "1980-01-01",
}
form = CustomUserCreationForm(data)
self.assertIs(form.is_valid(), False)
self.assertEqual(
form["username"].errors,
["This username has already been taken."],
)
# To verify that the login form rejects inactive users, use an authentication
# backend that allows them.