注意:
撰写本文时,搜索“ django-allauth自定义用户”时有197个问题。我还没有全部读过,但是在我读过的几本书中,这些值得注意:
问题的作者已经轻松实现了自定义用户模型,但希望修改登录表单之类的东西。
此外,我已经阅读并完成了official Django tutorial,mozilla Django tutorial和威尔·文森特(Will Vincent)的出色著作post(向我介绍了django-allauth
。 ,我还咨询了django-allauth
docs。
我想关注Will Vincent的tutorial,因为我发现它是其中最广泛的一种。显然,创建自定义用户模型很麻烦。
对于那些还没有阅读整个教程的人,[此时]] 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
中?
来自(Django)Full Example:
# ...
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
添加新字段:
会只是:
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