Search code examples
djangodjango-viewsdjango-formsdjango-templates

how do i save a user to a database in DJANGO using request.method == 'POST'?


I have a role-based sign up pages for a jobseeker and a recruiter. Form handling is based on role when a user clicks up when registering.

I have an issue with registering a user: when I do POST request it doesn't save a user to my database.

my role.html :

{% extends 'core/base.html' %}
{% block title %}Choose A Role{% endblock %}


{% block content %}
<div class="flex flex-col justify-center items-center">
  <div class="w-full max-w-md">
    <h1 class="text-3xl font-bold mb-4 text-center">Register by your role</h1>
    <p class="text-center">Choose the right role for you to enter our site</p>
    <form method="post" action="{% url 'core:role' %}" class="bg-amber-100 grid grid-cols-2 gap-2 w-full max-w-screen-sm">
      {% csrf_token %}

      <div class="flex items-center">
        <input type="radio" id="jobseeker1" name="role" value="jobseeker">
        <label class="w-full px-6 py-8 rounded-lg shadow-md bg-white border-2 border-blue-500 hover:bg-blue-500 hover:text-white cursor-pointer transition-colors duration-300" for="jobseeker1">
          <span class="text-xl font-bold uppercase">I'm a Jobseeker</span>
          <ul class="text-sm mt-2">
            <li>
              i want to apply for jobs
            </li>
          </ul>
          </label>
      </div>

      <div class="flex items-center">
        <input type="radio" id="recruiter2" name="role" value="recruiter">
        <label class="w-full px-6 py-8 rounded-lg shadow-md bg-white border-2 border-blue-500 hover:bg-blue-500 hover:text-white cursor-pointer transition-colors duration-300" for="recruiter2">
          <span class="text-xl font-bold uppercase">I'm a Recruiter</span>
          <ul class="text-sm mt-2">
            <li>
              i want to post jobs
            </li>
          </ul>
          </label>
      </div>


      <div class="flex mx-auto py-5 justify-items-center">
        <button class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline justify-items-center" type="submit">
          Continue to your role
        </button>
      </div>
    </form>
</div>
{% endblock %}


here is an example of a job seeker registration page:

{% extends 'core/base.html' %}
{% block title%}JobSeeker{% endblock %}

{% block content %}
<div class="w-1/2 my-6 mx-auto p-6 bg-gray-100 rounded-xl"> 
    <h1 class="mb-6 text-3xl">Job Seeker Registration.</h1>

    <form action="." method="post">
      {% csrf_token %}

      <div class="mb-3">
        <label class="inline-block mb-2">First name</label><br>
        {{ form.first_name }}
      </div>

      <div class="mb-3">
        <label class="inline-block mb-2">Last name</label><br>
        {{ form.last_name }}
      </div>

      <div class="mb-3">
        <label class="inline-block mb-2">Email</label><br>
        {{ form.email }}
      </div>

      <div class="mb-3">
        <label class="inline-block mb-2">Password</label><br>
        {{ form.password1 }}
      </div>

      <div class="mb-3">
        <label class="inline-block mb-2">Repeat password</label><br>
        {{ form.password2 }}
      </div>

      {% if form.errors or form.non_field_errors %}
      <div class="mb-3 p-6 bg-red-100 rounded-xl">
        {% for field in form %}
            {{ field.errors }}
        {% endfor %}

        {{ form.non_field_errors }}
      </div>
      {% endif %}

      <button class="py-4 px-8 text-lg bg-teal-500 hover:bg-teal-700 rounded-xl text-white" type="submit">Register</button>
    </form>
</div>
{% endblock %}

my views.py:

def role(request):
    selected_role = request.POST.get('role')
    if selected_role == 'jobseeker':

        if request.method == 'POST':
            form = JobseekerForm(request.POST)

            if form.is_valid():
                form.save()

                return redirect('/login/')
        else:
            form = JobseekerForm()

        return render(request, 'core/jobseeker_register.html', {
            "form": form
        })

    elif selected_role == 'recruiter':

        if request.method == 'POST':
            form = RecruiterForm(request.POST)

            if form.is_valid():
                form.save()

                return redirect('/login/')
        else:
            form = RecruiterForm()

        return render(request, 'core/recruiter_register.html', {
            "form": form
        })
    else:
        return render(request, 'core/role.html')

I already tried splitting this view into separate views for jobseeker and recruiter, but I couldn't get it to work because everytime i did this it didnt even show the form fields. So for now i decided to keep everything inside the single role view.

The form on the page works fine but nothing is saved to DB.


Solution

  • @David Wenzel made me think about how i should have structured my views for this issue i had.. it was something so simple , i finally got it to work role views :

    def role(request):
    selected_role = request.POST.get('role')
    if selected_role == 'jobseeker':
        return redirect('/jobseeker_register/')
    elif selected_role == 'recruiter':
        return redirect('/recruiter_register/')
    else:
        return render(request, 'core/role.html')
    
    def jobseeker_register(request):
        if request.method == 'POST':
            form = JobseekerForm(request.POST)
    
            if form.is_valid():
                form.save()
    
                return redirect('/login/')
    
        form = JobseekerForm()
    
        return render(request, 'core/jobseeker_register.html', {
            "form": form
        })
    
    
    def recruiter_register(request):
        if request.method == 'POST':
            form = RecruiterForm(request.POST)
    
            if form.is_valid():
                form.save()
    
                return redirect('/login/')
    
        form = RecruiterForm()
    
        return render(request, 'core/recruiter_register.html', {
            "form": form
        })