Django 2, Python 3: расширение пользовательской модели с различными типами профилей

Я пытаюсь иметь пользователей, которые будут либо врачами, либо пациентами (пока я планирую добавить больше типов пользователей). В приложении называется userПользовательская модель, которая расширяет AbstractUser. В приложении patients, У меня есть модель для профиля пользователя пациента, и то же самое для doctors приложение, модель доктора. Модели Patient и Doctor являются обычными моделями Django.

Затем я создал регистрационную форму пациента и пытаюсь зарегистрировать одного пациента. Когда я это делаю, я получаю следующую ошибку: 'Patient' object has no attribute 'set_password',

Мои модели:

class User(AbstractUser):
    USER_TYPE_CHOICES = (
        ('patient', 'Patient'),
        ('doctor', 'Doctor')
    )

    user_type = models.CharField(
        max_length=20,
        choices=USER_TYPE_CHOICES,
        default='patient',
    )

    username = models.CharField(max_length=100, blank=True, null=True)
    email = models.EmailField('email address', unique=True)

    objects = DoktorinoUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    def __str__(self):
        return self.email

class Patient(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='main_user')
    first_name = models.CharField(max_length=30, blank=False)
    last_name = models.CharField(max_length=30, blank=False)

    USERNAME_FIELD = 'email'

    phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Phone number must be in the following format: '+999999999'.")
    phone_number = models.CharField(validators=[phone_regex], max_length=17, blank=True)

    address = models.CharField(max_length=300, blank=False)
    city = models.ForeignKey(City, on_delete=models.CASCADE)

    def __str__(self):
        return self.first_name + ' ' + self.last_name

Мои формы.

class PatientSignUpForm(UserCreationForm):
    first_name = forms.CharField(max_length=50, required=True)
    last_name = forms.CharField(max_length=50, required=True)
    email = forms.EmailField(required=True)
    phone_number = forms.RegexField(
        regex=r'^\+?1?\d{9,15}$',
    )
    address = forms.CharField(max_length=150, required=True)
    city = ModelChoiceField(queryset=City.objects.all())

    class Meta:
        model = Patient
        fields = (
            'email', 'password1', 'password2', 'first_name', 'last_name', 'email', 'phone_number', 'address', 'city'
        )

и мои views.py:

def signup(request):
    if request.method == 'POST':
        form = PatientSignUpForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=username, password=raw_password)
            login(request, user)
            return redirect('home')
    else:
        form = PatientSignUpForm()
    return render(request, 'registration-patient.html', {'form': form})

AUTH_USER_MODEL = 'user.User' в settings.py

РЕДАКТИРОВАТЬ:

Я попытался добавить метод save_password к модели пациента, например так:

def set_password(self, raw_password):
        self.user.set_password(raw_password)

но возникает еще одна ошибка: RelatedObjectDoesNotExist at /user/register/ Patient has no user.

0 ответов

Другие вопросы по тегам