summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2015-10-28 15:59:17 -0400
committerTim Graham <timograham@gmail.com>2015-10-29 08:58:49 -0400
commit15ef1dd478c5b6f005e5f782b7619f718ed55e84 (patch)
treeecc98318982921d1bd0d0bb2fd0fc83742614024
parent0bd067d0950f49ea586b9c2f0cc74fee24b1d3e9 (diff)
Fixed #20846 -- Increased User.username max_length to 254 characters.
Thanks Collin Anderson and Nick Sandford for work on the patch.
-rw-r--r--django/contrib/auth/migrations/0008_alter_user_username_max_length.py32
-rw-r--r--django/contrib/auth/models.py4
-rw-r--r--docs/ref/contrib/auth.txt6
-rw-r--r--docs/releases/1.10.txt30
4 files changed, 69 insertions, 3 deletions
diff --git a/django/contrib/auth/migrations/0008_alter_user_username_max_length.py b/django/contrib/auth/migrations/0008_alter_user_username_max_length.py
new file mode 100644
index 0000000000..56705fa58f
--- /dev/null
+++ b/django/contrib/auth/migrations/0008_alter_user_username_max_length.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('auth', '0007_alter_validators_add_error_messages'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='user',
+ name='username',
+ field=models.CharField(
+ error_messages={'unique': 'A user with that username already exists.'},
+ help_text='Required. 254 characters or fewer. Letters, digits and @/./+/-/_ only.',
+ max_length=254,
+ unique=True,
+ validators=[
+ django.core.validators.RegexValidator(
+ '^[\\w.@+-]+$', 'Enter a valid username. '
+ 'This value may contain only letters, numbers and @/./+/-/_ characters.'
+ ),
+ ],
+ verbose_name='username',
+ ),
+ ),
+ ]
diff --git a/django/contrib/auth/models.py b/django/contrib/auth/models.py
index 070d7d4435..dfa76977d7 100644
--- a/django/contrib/auth/models.py
+++ b/django/contrib/auth/models.py
@@ -303,9 +303,9 @@ class AbstractUser(AbstractBaseUser, PermissionsMixin):
"""
username = models.CharField(
_('username'),
- max_length=30,
+ max_length=254,
unique=True,
- help_text=_('Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.'),
+ help_text=_('Required. 254 characters or fewer. Letters, digits and @/./+/-/_ only.'),
validators=[
validators.RegexValidator(
r'^[\w.@+-]+$',
diff --git a/docs/ref/contrib/auth.txt b/docs/ref/contrib/auth.txt
index 6cbfd88ac6..6ca2581397 100644
--- a/docs/ref/contrib/auth.txt
+++ b/docs/ref/contrib/auth.txt
@@ -21,9 +21,13 @@ Fields
.. attribute:: username
- Required. 30 characters or fewer. Usernames may contain alphanumeric,
+ Required. 254 characters or fewer. Usernames may contain alphanumeric,
``_``, ``@``, ``+``, ``.`` and ``-`` characters.
+ .. versionchanged:: 1.10
+
+ The ``max_length`` increased from 30 to 254 characters.
+
.. attribute:: first_name
Optional. 30 characters or fewer.
diff --git a/docs/releases/1.10.txt b/docs/releases/1.10.txt
index 602e34a6f9..b291dcfd41 100644
--- a/docs/releases/1.10.txt
+++ b/docs/releases/1.10.txt
@@ -258,6 +258,36 @@ to its proxied concrete class. This inconsistency was fixed by returning the
full set of fields pointing to a concrete class or one of its proxies in both
cases.
+:attr:`AbstractUser.username <django.contrib.auth.models.User.username>` ``max_length`` increased to 254
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A migration for :attr:`django.contrib.auth.models.User.username` is included.
+If you have a custom user model inheriting from ``AbstractUser``, you'll need
+to generate and apply a database migration for your user model.
+
+If you want to preserve the 30 character limit for usernames, use a custom form
+when creating a user or changing usernames::
+
+ from django.contrib.auth.forms import UserCreationForm
+
+ class MyUserCreationForm(UserCreationForm):
+ username = forms.CharField(
+ max_length=30,
+ help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.',
+ )
+
+If you wish to keep this restriction in the admin, set ``UserAdmin.add_form``
+to use this form::
+
+ from django.contrib.auth.admin import UserAdmin
+ from django.contrib.auth.models import User
+
+ class MyUserAdmin(UserAdmin):
+ add_form = MyUserCreationForm
+
+ admin.site.unregister(User)
+ admin.site.register(User, MyUserAdmin)
+
Miscellaneous
~~~~~~~~~~~~~