#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': '[email protected]',
> +            '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': '[email protected]',
 +            '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 [email protected].
To post to this group, send email to [email protected].
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.

Reply via email to