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.