Проблема с построением логики для регистрации модели в django
Я нахожусь в середине проекта. Я расширил пользовательскую модель пользователя django и модифицировал ее. вот моя модель пользователя:-
class User(AbstractUser):
name = models.CharField(max_length=200, null=True, blank=True)
usertype = models.CharField(choices = [('d','doctor'), ('p','patient')], max_length=1)
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = []
def __str__(self):
return self.name
Кроме того, я объявил две отдельные модели с именами Patient и Doctors. Моя цель состоит в том, чтобы зарегистрировать пользователей в соответствующих моделях (Doctors или Patients), проверяя тип пользователя. Вот эти модели:-
class Patient(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='patient')
dob = models.DateField(null=True, blank=True)
contact = models.CharField(null=True, blank=True, max_length=100)
def __str__(self):
return self.user.name
class Doctor(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='doctor')
deg = models.TextField(null=True, blank=True)
def __str__(self):
return self.user.name
Теперь на фронт-энде я хочу применить логику, когда каждый раз при регистрации пользователя пользователь выбирает тип пользователя и на основе этого выбора обновляется модуль "Доктор" или "Пациент". Я пробовал создавать отдельные формы для этого. Вот мои формы :-
class MyUserCreation(UserCreationForm):
class Meta:
model = User
fields = ['name','username','usertype']
class DoctorCreation(ModelForm):
class Meta:
model = Doctor
fields = ['user','deg']
class PatientCreation(ModelForm):
class Meta:
model = Patient
fields = ['dob', 'contact','user']
<
def registerUser(request):
page = 'general'
form = MyUserCreation()
if request.method == 'POST':
form = MyUserCreation(request.POST)
if form.is_valid:
user = form.save(commit=False)
user.save()
login(request, user)
return redirect('home')
else:
messages.error(request, 'Error occured')
if user.usertype == 'p':
page = 'patient'
form = PatientCreation()
form = PatientCreation(request.POST)
if form.is_valid:
form.save()
elif user.usertype== 'd':
page = 'doctor'
form = DoctorCreation()
form = DoctorCreation(request.POST)
if form.is_valid:
form.save()
context = {'form':form, 'page':page}
return render(request, 'rec/register_user.html', context )
<
Для упрощения на передней стороне это решение работает следующим образом:
- Страница загрузки с формой пользователя
- Отправляет форму пользователя
- Использует значение для загрузки следующей формы
- Отправить следующую форму + перенаправление
Примечания:
- Использует значения POSTed для определения формы отправки
- Использует Initial для установки пользователя для второй формы
- Этот текущий поток может быть разбит на 3 вида со своими собственными URL
Django View
def registerUser(request):
form = None
if request.method == 'POST':
valid = False
if 'usertype' in request.POST:
# 1st form submit
form = MyUserCreation(request.POST)
if form.is_valid:
valid = True
user = form.save(commit=False)
user.save()
login(request, user)
# Get 2nd form for load
if user.usertype == 'p':
page = 'patient'
form = PatientCreation(initial={'user':user})
elif user.usertype== 'd':
page = 'doctor'
form = DoctorCreation(initial={'user':user})
else:
# 2nd form submit
if 'dob' in request.POST:
form = PatientCreation(request.POST)
if form.is_valid:
form.save()
valid = True
elif 'deg' in request.POST:
form = DoctorCreation(request.POST)
if form.is_valid:
form.save()
valid = True
if valid:
# form sequence done
return redirect('home')
if not valid:
# a form failed somewhere
print(form.errors)
messages.error(request, 'Error occured')
if form == None:
page = 'general'
form = MyUserCreation()
context = {'form':form, 'page':page}
return render(request, 'rec/register_user.html', context )
Основная HTML форма Django
<form action="" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit">
</form>
Теперь вы можете сделать это одной страницей, усложнив шаблон, с помощью JQuery скрывая/показывая дополнительные поля на основе значения выпадающего списка при изменении, но я предположил, что это будет путь, который вы хотите.