2

AbstractBaseUserを使用して、PermissionsMixinこれらの 2 つのチュートリアル (チュートリアル 1チュートリアル 2 )に従ってカスタム ユーザー モデルを作成しています。

これまでのモデルは次のとおりです。

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

今、私が混乱しているのは、チュートリアル 1で、作成者がカスタム User モデル用のカスタム マネージャーを作成していないことです。代わりに、フォームを使用してユーザーを作成します。

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

しかし、チュートリアル 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を参照すると、カスタム ユーザー モデルの例があり、カスタム マネージャーを使用しています。私の質問は、他のカスタム マネージャーを作成しなくてもよいかどうか、そうでない場合、カスタム マネージャーを作成する用途は何ですか?

4

1 に答える 1

1

これは、ドキュメントの関連セクションであると思います。

User モデルのカスタム マネージャーも定義する必要があります。User モデルが 、 、 、 、 、およびフィールドを Django のデフォルトと同じように定義している場合usernameemailDjangois_staffis_active;is_superuserlast_loginインストールdate_joinedするだけUserで済みます。UserManagerただし、ユーザー モデルが異なるフィールドを定義する場合は、 [およびメソッド]BaseUserManagerを提供するように拡張するカスタム マネージャーを定義する必要があります。create_user()create_superuser()

ドキュメントの例では、フィールドを設定できるようにカスタム マネージャーを定義する必要がありdate_of_birthます。

emailチュートリアルの例では、一意の識別子として を使用し、個別のユーザー名フィールドがないため、カスタム マネージャーが必要なようです。

于 2015-10-09T09:30:56.833 に答える