首页 > 解决方案 > 如何防止用户同时是两种类型?

问题描述

我有一个来自这个答案的模型:

class MyUser(AbstractUser):
    is_student = models.BooleanField(default=False)
    is_teacher = models.BooleanField(default=False)

是否可以防止在模型级别同时创建两种类型的新用户?换句话说,它可能只是is_student == Falseis_teacher == True反之亦然。

标签: djangodjango-users

解决方案


据我所知,您不能拥有多个具有不同属性的用户模型。Django 只能有一个 User 模型。如果您需要的唯一更改是需要删除其中一个字段,那么我最好的选择是在需要时忽略该字段。例如,当学生想要注册时,他们单击“以学生身份注册”链接,您只需is_teacher在表单中省略该字段,反之亦然,如果它是教师。

这方面的一个例子可能是:

用户型号

class User(AbstractUser):
    """User model."""
    username = models.CharField(max_length=75, unique=True)
    email = models.EmailField(_('email address'), unique=True)
    is_student = models.BooleanField(default=False)
    is_teacher = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    objects = UserManager()

    def __str__(self):
        """Return a string representation of the user."""
        string_repr = str(self.username) + ' (' + str(self.email) + ')'

        return string_repr

UserCreationForm 模型(适用于学生和教师):

class CreateUserStudentForm(UserCreationForm):
    # Require the email field.
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = ("email", "username", "is_student", "password1", "password2")

    def clean_email(self):
        data = self.cleaned_data['email']
        return data.lower()

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        # Get all the relevant data, and save it.
        user.email = self.clean_email()
        user.username = self.cleaned_data["username"]
        user.is_student = self.cleaned_data["is_student"]
        user.set_password(self.cleaned_data['password1'])

        # Save the newly created user.
        if commit:
            user.save()
        return user

class CreateUserTeacherForm(UserCreationForm):
    # Require the email field.
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = ("email", "username", "is_teacher", "password1", "password2")

    def clean_email(self):
        data = self.cleaned_data['email']
        return data.lower()

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        # Get all the relevant data, and save it.
        user.email = self.clean_email()
        user.username = self.cleaned_data["username"]
        user.is_teacher = self.cleaned_data["is_teacher"]
        user.set_password(self.cleaned_data['password1'])

        # Save the newly created user.
        if commit:
            user.save()
        return user

推荐阅读