#26381: UserCreationForm cannot be reused with a custom USERNAME_FIELD value ------------------------------+---------------------------------------- Reporter: berkerpeksag | Owner: berkerpeksag Type: Bug | Status: assigned Component: contrib.auth | Version: 1.9 Severity: Normal | Resolution: Keywords: | Triage Stage: Unreviewed Has patch: 1 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 ------------------------------+---------------------------------------- Changes (by berkerpeksag):
* owner: nobody => berkerpeksag * status: new => assigned Old description: > I noticed this while working on #25617. If you have a custom user model > with `USERNAME_FIELD = 'email'`, you can't just subclass > `UserCreationForm`. > > Here is a test case: > > {{{ > diff --git a/tests/auth_tests/test_forms.py > b/tests/auth_tests/test_forms.py > index 6172c44..1d4cd48 100644 > --- a/tests/auth_tests/test_forms.py > +++ b/tests/auth_tests/test_forms.py > @@ -20,7 +20,7 @@ from django.utils.encoding import force_text > from django.utils.text import capfirst > from django.utils.translation import ugettext as _ > > -from .models.custom_user import ExtensionUser > +from .models.custom_user import CustomUser, ExtensionUser > from .settings import AUTH_TEMPLATES > > @@ -139,6 +139,22 @@ class UserCreationFormTest(TestDataMixin, TestCase): > form = CustomUserCreationForm(data) > self.assertTrue(form.is_valid()) > > + > @override_settings(AUTH_MODEL='auth_tests.models.custom_user.CustomUser') > + def test_custom_form_with_different_username_field(self): > + class CustomUserCreationForm(UserCreationForm): > + class Meta(UserCreationForm.Meta): > + model = CustomUser > + fields = ('email', 'date_of_birth') > + > + data = { > + 'email': 't...@client222.com', > + 'password1': 'testclient', > + 'password2': 'testclient', > + 'date_of_birth': '1988-02-24', > + } > + form = CustomUserCreationForm(data) > + self.assertTrue(form.is_valid()) > + > def test_password_whitespace_not_stripped(self): > data = { > 'username': 'testuser', > }}} > > And here is the traceback: > > {{{ > Traceback (most recent call last): > File "/home/berker/projects/django/django/test/utils.py", line 208, in > inner > return func(*args, **kwargs) > File "/home/berker/projects/django/tests/auth_tests/test_forms.py", > line 155, in test_custom_form_with_different_username_field > form = CustomUserCreationForm(data) > File "/home/berker/projects/django/django/contrib/auth/forms.py", line > 85, in __init__ > self.fields['username'].widget.attrs.update({'autofocus': ''}) > KeyError: u'username' > }}} > > I will open a oull request to fix this shortly. New description: I noticed this while working on #25617. If you have a custom user model with `USERNAME_FIELD = 'email'`, you can't just subclass `UserCreationForm`. Here is a test case: {{{ diff --git a/tests/auth_tests/test_forms.py b/tests/auth_tests/test_forms.py index 6172c44..1d4cd48 100644 --- a/tests/auth_tests/test_forms.py +++ b/tests/auth_tests/test_forms.py @@ -20,7 +20,7 @@ from django.utils.encoding import force_text from django.utils.text import capfirst from django.utils.translation import ugettext as _ -from .models.custom_user import ExtensionUser +from .models.custom_user import CustomUser, ExtensionUser from .settings import AUTH_TEMPLATES @@ -139,6 +139,22 @@ class UserCreationFormTest(TestDataMixin, TestCase): form = CustomUserCreationForm(data) self.assertTrue(form.is_valid()) + @override_settings(AUTH_MODEL='auth_tests.models.custom_user.CustomUser') + def test_custom_form_with_different_username_field(self): + class CustomUserCreationForm(UserCreationForm): + class Meta(UserCreationForm.Meta): + model = CustomUser + fields = ('email', 'date_of_birth') + + data = { + 'email': 't...@client222.com', + 'password1': 'testclient', + 'password2': 'testclient', + 'date_of_birth': '1988-02-24', + } + form = CustomUserCreationForm(data) + self.assertTrue(form.is_valid()) + def test_password_whitespace_not_stripped(self): data = { 'username': 'testuser', }}} And here is the traceback: {{{ Traceback (most recent call last): File "/home/berker/projects/django/django/test/utils.py", line 208, in inner return func(*args, **kwargs) File "/home/berker/projects/django/tests/auth_tests/test_forms.py", line 155, in test_custom_form_with_different_username_field form = CustomUserCreationForm(data) File "/home/berker/projects/django/django/contrib/auth/forms.py", line 85, in __init__ self.fields['username'].widget.attrs.update({'autofocus': ''}) KeyError: u'username' }}} I will open a pull request to fix this shortly. -- -- Ticket URL: <https://code.djangoproject.com/ticket/26381#comment:3> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/070.77840f5b688f957c726e4cdeccc748c4%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.