带有Django v2 +自定义用户模型和自定义用户管理器的django-allauth

时间:2018-11-28 14:54:25

标签: python django django-allauth

注意

撰写本文时,搜索“ 自定义用户”时有197个问题。我还没有全部读过,但是在我读过的几本书中,这些值得注意:

问题的作者已经轻松实现了自定义用户模型,但希望修改登录表单之类的东西。

此外,我已经阅读并完成了official Django tutorialmozilla 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

0 个答案:

没有答案