Home > Net >  Problem with logic building for registering a model in django
Problem with logic building for registering a model in django

Time:09-15

I am in the middle of a project. I have extended the custom django user and modified it. this is my user model:-

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

Also I have declared two seperate models named Patient and Doctors. My objective is to register the users in their respective models(Doctors or Patients) by checking the usertype. Here are those models:-

     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

Now at the front end I want to apply the logic as every time a user is registered the user selects the usertype and based on that selection the Doctor or the Patient module is updated. I have tried creating separate forms for that too. Here are my forms :-

    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']

The view handling this URL is :-

 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 )

The front end for this project is handled with very basic HTML. Also, if possible I want the front end such that every time a user is registered and the usertype is selected(which is a dropdown menu) some more fields show up depending on the usertype selection by the user. If selected Doctor the additional fields respective to the Doctor module show up, and same for the patient module.

CodePudding user response:

To keep it simple on the front end this solution works like:

  1. Loads Page with User Form
  2. Submit User Form
  3. Uses value to Load Next form
  4. Submit Next Form Redirect

Notes:

  • Uses the Values POSTed to determine what form is being submitted
  • Uses Initial to set User for the 2nd Form
  • This current flow could be broken up into 3 view with their own distinct URLs
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 )
Basic Django HTML Form
<form action="" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>

Now you could make this a single page by making the Template more complex, with JQuery Hiding/Showing extra fields based on dropdown Value on Change, but I assumed this would be the route you wanted.

  • Related