【问题标题】:Is it required to make a custom manger for a custom user model in django是否需要在 django 中为自定义用户模型制作自定义管理器
【发布时间】:2016-01-07 02:53:12
【问题描述】:

我正在按照这两个教程(tutorial-1tutorial-2)使用AbstractBaseUserPermissionsMixin 制作自定义用户模型。

这是迄今为止的模型:

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField('email address', unique=True, db_index=True)
    username = models.CharField('username', unique=True, db_index=True)
    joined = models.DateField(auto_now_add=True)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'

    def __unicode__(self):
        return self.email

现在我很困惑的是,在tutorial-1 中,作者没有为自定义用户模型制作任何自定义管理器。相反,他使用表单来创建用户。

class RegistrationForm(forms.ModelForm):
    email = forms.EmailField(label = 'Email')
    password1 = forms.CharField(widget = forms.PasswordInput(), label = "Password")
    password2 = forms.CharField(widget = forms.PasswordInput(), label = 'Retype password')

    class Meta:
        model = User
        fields = ['email', 'username', 'password1', 'password2']

    def clean(self):
        """
        Verify that the values entered into the password fields match
        """
        cleaned_data = super(RegistrationForm, self).clean()
        if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:
            if self.cleaned_data['password1'] != self.cleaned_data['password2']:
                raise ValidationError("Password don't match.")
        return self.cleaned_data

    def save(self, commit=True):
        user = super(RegistrationForm, self).save(commit=False)
        user.set_password(self.cleaned_data['password1'])
        if commit:
            user.save()
        return user

但是在tutorial-2,它的作者为自定义的User模型做了一个自定义的管理器。

class UserManager(BaseUserManager):

    def create_user(self, email, password, **kwargs):
        user = self.model(
            email=self.normalize_email(email),
            is_active=True,
            **kwargs
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password, **kwargs):
        user = self.model(
            email=email,
            is_staff=True,
            is_superuser=True,
            is_active=True,
            **kwargs
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

引用Django Docs,有一个自定义用户模型的示例,它使用自定义管理器。我的问题是,是否可以不创建任何其他自定义管理器,如果不是,创建自定义管理器有什么用?

【问题讨论】:

    标签: django django-models django-managers django-custom-user django-custom-manager


    【解决方案1】:

    我认为这是来自the docs 的相关部分:

    您还应该为您的用户模型定义一个自定义管理器。如果你的用户模型定义了usernameemailis_staffis_activeis_superuserlast_logindate_joined字段与Django的默认User相同,你可以安装Django的@9876543 @;但是,如果您的 User 模型定义了不同的字段,您将需要定义一个自定义管理器来扩展 BaseUserManager 提供 [create_user()create_superuser() 方法]。

    文档中的示例需要定义一个自定义管理器,这样才能设置date_of_birth字段。

    看来教程中的示例需要自定义管理器,因为它使用email 作为唯一标识符,并且没有单独的用户名字段。

    【讨论】:

    • 是的,我现在得到了,谢谢。但我仍然感到困惑,因为在教程 1 中,他使用 USERNAME_FIELD 作为电子邮件,但他没有创建另一个自定义管理器来处理这个问题。你能帮我解决这个问题吗?谢谢。
    • 如果您在第一个教程中 look at this comment,在我看来,忽略经理是个错误。
    • 好的。我想我现在正在关注。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2013-06-01
    • 2011-05-03
    相关资源
    最近更新 更多