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.
@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
})