Last active
November 12, 2019 00:49
-
-
Save timsavage/0cabec3e384b2dffa389 to your computer and use it in GitHub Desktop.
Customising Django Auth username length for Django 1.8+
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
default_app_config = 'myapp.auth.apps.MyAuthAppConfig' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from django.contrib import admin | |
from django.contrib.auth.admin import UserAdmin | |
from .models import User | |
admin.site.register(User, UserAdmin) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from django.apps import AppConfig | |
class MyAuthAppConfig(AppConfig): | |
name = 'myapp.auth' | |
label = 'my_auth' | |
verbose_name = 'Authentication and Authorization (*)' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
USERNAME_MAX_LENGTH = 255 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
from __future__ import unicode_literals | |
from django.db import migrations, models | |
import django.contrib.auth.models | |
import django.utils.timezone | |
import django.core.validators | |
class Migration(migrations.Migration): | |
dependencies = [ | |
('auth', '0006_require_contenttypes_0002'), | |
] | |
operations = [ | |
migrations.CreateModel( | |
name='User', | |
fields=[ | |
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID', auto_created=True)), | |
('password', models.CharField(verbose_name='password', max_length=128)), | |
('last_login', models.DateTimeField(blank=True, verbose_name='last login', null=True)), | |
('is_superuser', models.BooleanField(help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status', default=False)), | |
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, verbose_name='username', max_length=30, help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.', unique=True, validators=[django.core.validators.RegexValidator('^[\\w.@+-]+$', 'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.', 'invalid')])), | |
('first_name', models.CharField(blank=True, verbose_name='first name', max_length=30)), | |
('last_name', models.CharField(blank=True, verbose_name='last name', max_length=30)), | |
('email', models.EmailField(blank=True, verbose_name='email address', max_length=254)), | |
('is_staff', models.BooleanField(help_text='Designates whether the user can log into this admin site.', verbose_name='staff status', default=False)), | |
('is_active', models.BooleanField(help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active', default=True)), | |
('date_joined', models.DateTimeField(verbose_name='date joined', default=django.utils.timezone.now)), | |
('groups', models.ManyToManyField(to='auth.Group', verbose_name='groups', related_query_name='user', related_name='user_set', help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', blank=True)), | |
('user_permissions', models.ManyToManyField(to='auth.Permission', verbose_name='user permissions', related_query_name='user', related_name='user_set', help_text='Specific permissions for this user.', blank=True)), | |
], | |
options={ | |
'db_table': 'auth_user', | |
'verbose_name': 'user', | |
'verbose_name_plural': 'users', | |
}, | |
managers=[ | |
('objects', django.contrib.auth.models.UserManager()), | |
], | |
), | |
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
from __future__ import unicode_literals | |
from django.db import migrations, models | |
import django.core.validators | |
class Migration(migrations.Migration): | |
dependencies = [ | |
('my_auth', '0001_initial'), | |
] | |
operations = [ | |
migrations.AlterField( | |
model_name='user', | |
name='username', | |
field=models.CharField(error_messages={'unique': 'A user with that username already exists.'}, max_length=255, verbose_name='username', validators=[django.core.validators.RegexValidator('^[\\w.@+-]+$', 'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.', 'invalid')], help_text='Required. 255 characters or fewer. Letters, digits and @/./+/-/_ only.', unique=True), | |
), | |
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from django.core import validators | |
from django.core.mail import send_mail | |
from django.contrib.auth.models import UserManager, PermissionsMixin, AbstractBaseUser | |
from django.db import models | |
from django.utils.translation import ugettext_lazy as _ | |
from django.utils import timezone | |
from .constants import USERNAME_MAX_LENGTH | |
class User(AbstractBaseUser, PermissionsMixin): | |
""" | |
An abstract base class implementing a fully featured User model with | |
admin-compliant permissions. | |
Username, password and email are required. Other fields are optional. | |
""" | |
class Meta: | |
db_table = 'auth_user' | |
verbose_name = _('user') | |
verbose_name_plural = _('users') | |
username = models.CharField(_('username'), max_length=USERNAME_MAX_LENGTH, unique=True, | |
help_text=_('Required. {} characters or fewer. Letters, digits and ' | |
'@/./+/-/_ only.'.format(USERNAME_MAX_LENGTH)), | |
validators=[ | |
validators.RegexValidator(r'^[\w.@+-]+$', | |
_('Enter a valid username. ' | |
'This value may contain only letters, numbers ' | |
'and @/./+/-/_ characters.'), 'invalid'), | |
], | |
error_messages={ | |
'unique': _("A user with that username already exists."), | |
}) | |
first_name = models.CharField(_('first name'), max_length=30, blank=True) | |
last_name = models.CharField(_('last name'), max_length=30, blank=True) | |
email = models.EmailField(_('email address'), blank=True) | |
is_staff = models.BooleanField(_('staff status'), default=False, | |
help_text=_('Designates whether the user can log into this admin ' | |
'site.')) | |
is_active = models.BooleanField(_('active'), default=True, | |
help_text=_('Designates whether this user should be treated as ' | |
'active. Unselect this instead of deleting accounts.')) | |
date_joined = models.DateTimeField(_('date joined'), default=timezone.now) | |
objects = UserManager() | |
USERNAME_FIELD = 'username' | |
REQUIRED_FIELDS = ['email'] | |
def get_full_name(self): | |
""" | |
Returns the first_name plus the last_name, with a space in between. | |
""" | |
full_name = '%s %s' % (self.first_name, self.last_name) | |
return full_name.strip() | |
def get_short_name(self): | |
"Returns the short name for the user." | |
return self.first_name | |
def email_user(self, subject, message, from_email=None, **kwargs): | |
""" | |
Sends an email to this User. | |
""" | |
send_mail(subject, message, from_email, [self.email], **kwargs) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
AUTH_USER_MODEL = 'myapp.User'
in settings.py