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