Django 1.5. Своя модель User

Дата публикации:29 апреля 2013 г. 1:29:20

Здравствуйте! Не так давно вышел новый релиз Django, в котором была добавлена возможность создавать свою модель пользователя. В документации есть ряд примеров, но с ними мне пришлось довольно долго разбираться и если вы это читаете, значит я не один такой :) Итак, приступим. Первое, что нам потребуется - это поправить файл настроек. В него мы добавим несколько строк.

Файл settings.py

AUTH_USER_MODEL = 'YourApp.User'
AUTHENTICATION_BACKENDS = [
    'YourApp.UserBackend',
]

 Здесь мы сказали Django откуда брать модель пользователя, а также добавили свой бэкэнд аутентификации. Дальше создадим этот класс и класс нашего пользователя.

Я добавил этот код в __init__.py папки с приложением.

from django.contrib.auth.backends import ModelBackend

from yourapp.models import User

class UserBackend(ModelBackend):
    def authenticate(self, username = None, password = None, **kwargs):
        try:
            user = User.objects.get(email = username)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            user = User.objects.get(pk = user_id)
            if user.is_active:
                return user
            return None
        except User.DoesNotExist:
            return None

Здесь, в принципе не должно быть вопросов. Первая функция отвечает за авторизацию, вторая возвращает пользователя. Единственное, обратите внимание, что в моем случае авторизация проходит по email. Далее, создадим класса User, но сначала создадим класса менеджера модели.

Файл models.py

from django.contrib.auth.models import BaseUserManager, AbstractBaseUser

class UserManager(BaseUserManager):
    def create_user(self, email, password = None, **kwargs):
        if not email:
            raise ValueError(_('Users must have an email address'))
 
        user = self.model(
            email = UserManager.normalize_email(email),
            **kwargs
        )
 
        user.set_password(password)
        user.save(using = self._db)
        return user
 
    def create_superuser(self, email, password, **kwargs):
        user = self.create_user(email,
            password = password,
            **kwargs
        )
        user.is_admin = True
        user.save(using = self._db)
        return user

Затем класс User.

class User(AbstractBaseUser):
    email = models.EmailField(
        max_length = 80,
        unique = True,
        verbose_name = _('email'),
    )
    full_name = models.CharField(
        max_length = 250,
        verbose_name = _('full name'),
    )
    
    is_active = models.BooleanField(
        default = True,
        verbose_name = _('is active')
    )
    is_admin = models.BooleanField(
        default = False,
        verbose_name = _('is admin')
    )
    
    USERNAME_FIELD = 'email'

    REQUIRED_FIELDS = [
        'first_name',
    ]
    
    objects = EUserManager()
 
    def get_short_name(self):
        return self.email
 
    def __unicode__(self):
        return self.email
 
    def has_perm(self, perm, obj=None):
        return True
 
    def has_module_perms(self, app_label):
        return True
 
    @property
    def is_staff(self):
        return self.is_admin
    
    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')

 

Немного пояснений. В моем случае есть всего две группы пользователей. Обычные и Админы. Все зарегистрированные по-умолчанию становятся активными без активации по Email. Вы можете добавить эту возможность самостоятельно, мне это было не нужно. Вы можете указать любое количество полей для пользователя, главное помните, если вы хотите сделать их обязательными к заполнению, то добавьте их имена в REQUIRED_FIELDS. Остальную информацию вы сможете найти на официальном сайте Django. Спасибо за внимание!

Метки:django, custom user, своя модель пользователя, python