Commit 15ef1dd4 authored by Tim Graham's avatar Tim Graham
Browse files

Fixed #20846 -- Increased User.username max_length to 254 characters.

Thanks Collin Anderson and Nick Sandford for work on the patch.
parent 0bd067d0
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
# -*- 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',
            ),
        ),
    ]
+2 −2
Original line number Diff line number Diff line
@@ -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.@+-]+$',
+5 −1
Original line number Diff line number Diff line
@@ -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.
+30 −0
Original line number Diff line number Diff line
@@ -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
~~~~~~~~~~~~~