Проблема с построением логики для регистрации модели в 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 )
<

Для упрощения на передней стороне это решение работает следующим образом:

  1. Страница загрузки с формой пользователя
  2. Отправляет форму пользователя
  3. Использует значение для загрузки следующей формы
  4. Отправить следующую форму + перенаправление

Примечания:

  • Использует значения 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 скрывая/показывая дополнительные поля на основе значения выпадающего списка при изменении, но я предположил, что это будет путь, который вы хотите.

Вернуться на верх