Примечание :
На момент написания этого вопроса было 197 вопросов при поиске " django-allauth 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