Как помешать пользователю быть обоих типов? - PullRequest
1 голос
/ 22 февраля 2020

У меня есть модель, подобная этот ответ :

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

Можно ли предотвратить создание нового пользователя обоих типов одновременно на уровне модели? Другими словами, это могут быть ТОЛЬКО is_student == False и is_teacher == True или наоборот.

1 Ответ

1 голос
/ 22 февраля 2020

Насколько я знаю, у вас не может иметь несколько моделей пользователей с разными свойствами. Django может иметь только одну модель пользователя. Если единственное изменение, которое вам нужно, это то, что одно из полей должно быть пропущено, лучше всего было бы просто игнорировать поле, когда это необходимо. Например, когда студент хочет зарегистрироваться, он щелкает ссылку «Зарегистрироваться как студент», где вы просто пропускаете поле 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...