Django-Allauth с Django v2 + пользовательская модель пользователя и пользовательский менеджер - PullRequest
0 голосов
/ 28 ноября 2018

Примечание :

На момент написания этого вопроса было 197 вопросов при поиске " custom user".Я не прочитал все из них, но из нескольких, которые я прочитал, они были заметны:

, где авторы вопросов без особого труда внедрили пользовательские пользовательские модели, но хотят изменить такие вещи, как форма входа.

В дополнениеЯ прочитал и закончил официальный учебник по Django , учебник по Mozilla Django и этот замечательный пост Уилла Винсента (который познакомил меня с django-allauth. Наконец, я также консультировался с django-allauth документами .


Я хотел бы сосредоточиться на уроке Уилла Винсента, поскольку я нахожу егосамый обширный из нескольких, особенно стоит создать пользовательскую модель.

Для тех, кто еще не прочитал весь учебник, в [этот момент]] Will Vincent User Model было создано приложение с именем users и в файле <project>/users/models.py у нас есть пользовательскиймодель пользователя:

from django.contrib.auth.models import AbstractUser, UserManager

class CustomUserManager(UserManager):
    pass

class CustomUser(AbstractUser):
    objects = CustomUserManager()

Является ли эта модель самой сложной пользовательской моделью?нет.Объясняется ли, что такое UserManager или что это значит?также нет, но это пользовательский пользователь!

Итак, давайте проверим AbstractUser:

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    pass

Так что на данный момент User завернут вAbstractUser, который теперь обернут в CustomAbstractUser.

Поскольку User не обладает всеми приятными функциями, предоставляемыми django-allauth, я предполагаю, что он изменил AbstractUser (но я вполне могу ошибаться)и мы просто обертываем это здесь.

Мой вопрос, возможно, тривиально, как можно включить дополнительные поля в CustomUserModel? ​​

Из (Джанго) Полный пример :

# ... 

class MyUserManager(BaseUserManager):
    # ...

# ...    

class MyUser(AbstractBaseUser):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    date_of_birth = models.DateField()
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = MyUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['date_of_birth']
    # ...

# ...

и мы видим то же самое соглашение со строкой objects = MyUserManager(), что и в objects = CustomUserManager():

, несмотря на все это, мне все же неясно, где я будудобавьте новые поля в мой CustomUserModel, если я хочу расширить пользовательскую модель django-allauth, чтобы иметь оба:

  • некоторые простые, по умолчанию необязательные поля
  • one-to-много поля
  • некоторые новые обязательные поля

Это будет просто:

class CustomUser(AbstractUser):
    objects = CustomUserManager()


    is_custom_field = models.BooleanField(default=True)
    is_custom_required_field = models.BooleanField(default=True)

    REQUIRED_FIELDS += ['is_custom_required_field']

    models.OneToOneField(
        Place,
        on_delete=models.CASCADE,
        primary_key=True,
    )


# from Django Docs one-to-one field example
class Place(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=80)

    def __str__(self):
        return "%s the place" % self.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...