#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.

Reply via email to