Extra usefful links, especially the first one
- Django official docs full example
- Django authtool packager source code: read the models.py, admin.py and forms.py file
from django.contrib import admin | |
from django.contrib.auth.admin import UserAdmin as DjangoUserAdmin | |
from django.utils.translation import ugettext_lazy as _ | |
from .models import User | |
@admin.register(User) | |
class UserAdmin(DjangoUserAdmin): | |
"""Define admin model for custom User model with no email field.""" | |
fieldsets = ( | |
(None, {'fields': ('email', 'password')}), | |
(_('Personal info'), {'fields': ('first_name', 'last_name')}), | |
(_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', | |
'groups', 'user_permissions')}), | |
(_('Important dates'), {'fields': ('last_login', 'date_joined')}), | |
) | |
add_fieldsets = ( | |
(None, { | |
'classes': ('wide',), | |
'fields': ('email', 'password1', 'password2'), | |
}), | |
) | |
list_display = ('email', 'first_name', 'last_name', 'is_staff') | |
search_fields = ('email', 'first_name', 'last_name') | |
ordering = ('email',) |
Extra usefful links, especially the first one
# users/model.py | |
from django.contrib.auth.models import AbstractUser, UserManager as DjangoUserManager | |
from django.utils.translation import gettext_lazy as _ | |
class UserManager(DjangoUserManager): | |
"""Define a model manager for User model with no username field.""" | |
def _create_user(self, email, password, **extra_fields): | |
"""Create and save a User with the given email and password.""" | |
if not email: | |
raise ValueError('The given email must be set') | |
email = self.normalize_email(email) | |
user = self.model(email=email, **extra_fields) | |
user.set_password(password) | |
user.save(using=self._db) | |
return user | |
def create_user(self, email, password=None, **extra_fields): | |
"""Create and save a regular User with the given email and password.""" | |
extra_fields.setdefault('is_staff', False) | |
extra_fields.setdefault('is_superuser', False) | |
return self._create_user(email, password, **extra_fields) | |
def create_superuser(self, email, password, **extra_fields): | |
"""Create and save a SuperUser with the given email and password.""" | |
extra_fields.setdefault('is_staff', True) | |
extra_fields.setdefault('is_superuser', True) | |
if extra_fields.get('is_staff') is not True: | |
raise ValueError('Superuser must have is_staff=True.') | |
if extra_fields.get('is_superuser') is not True: | |
raise ValueError('Superuser must have is_superuser=True.') | |
return self._create_user(email, password, **extra_fields) | |
class User(AbstractUser): | |
"""User model.""" | |
username = None | |
email = models.EmailField(_('email address'), unique=True) | |
USERNAME_FIELD = 'email' | |
REQUIRED_FIELDS = [] | |
objects = UserManager() | |