I'm trying to create a confirmation page in Django. I have one view which renders a form, then user clicks on Submit and the objects are saved into the database.
What I want to do is not to save objects into the database when user clicks on submit. I want to render another page, where user can confirm his order so he can see there all objects he will create and click on confirm.
So I've created another view which is called when form is submitted. It should show a table with data and then, if user clicks on Confirm, it should save objects. The problem is - since I'm calling the view and passing there an old request, the request is POST so I can't detect a difference between click on submit and redirect from old view.
So I will probably need to put a parameter 'confirm' to request I'm sending to the next view.
Normally, I would put there if request.method == 'POST' > save objects else render table with values
This is the original view which renders a form an save objects:
def create_order(request):
import pdb
pdb.set_trace()
LanguageLevelFormSet = formset_factory(LanguageLevelForm, extra=5, max_num=5)
language_level_formset = LanguageLevelFormSet(request.POST or None)
job_creation_form = JobCreationForm(request.POST or None, request.FILES or None)
context = {'job_creation_form': job_creation_form,
'formset': language_level_formset}
if request.method == 'POST':
if job_creation_form.is_valid() and language_level_formset.is_valid():
cleaned_data_job_creation_form = job_creation_form.cleaned_data
cleaned_data_language_level_formset = language_level_formset.cleaned_data
for language_level_form in [d for d in cleaned_data_language_level_formset if d]:
language = language_level_form['language']
level = language_level_form['level']
job = Job(
customer=request.user,
text_to_translate=cleaned_data_job_creation_form['text_to_translate'],
file=cleaned_data_job_creation_form['file'],
short_description=cleaned_data_job_creation_form['short_description'],
notes=cleaned_data_job_creation_form['notes'],
language_from=cleaned_data_job_creation_form['language_from'],
language_to=language,
level=level,
)
job.save()
return HttpResponseRedirect('/order-success')
else:
return render(request, 'auth/jobs/create-job.html', context=context)
return render(request, 'auth/jobs/create-job.html', context=context)
This is the new approach:
def create_order(request):
LanguageLevelFormSet = formset_factory(LanguageLevelForm, extra=5, max_num=5)
language_level_formset = LanguageLevelFormSet(request.POST or None)
job_creation_form = JobCreationForm(request.POST or None, request.FILES or None)
context = {'job_creation_form': job_creation_form,
'formset': language_level_formset}
if request.method == 'POST':
if job_creation_form.is_valid() and language_level_formset.is_valid():
cleaned_data_job_creation_form = job_creation_form.cleaned_data
cleaned_data_language_level_formset = language_level_formset.cleaned_data
context = {
'cleaned_data_job_creation_form':cleaned_data_job_creation_form,
"cleaned_data_language_level_formset":cleaned_data_language_level_formset,
}
return confirm_order(request,context)
else:
return render(request, 'auth/jobs/create-job.html', context=context)
return render(request, 'auth/jobs/create-job.html', context=context)
def confirm_order(request,context):
cleaned_data_job_creation_form = context['cleaned_data_job_creation_form']
cleaned_data_language_level_formset = context['cleaned_data_language_level_formset']
if request.method == 'POST': # HERE IS THE PROBLEM, It's POST in both cases
for language_level_form in [d for d in cleaned_data_language_level_formset if d]:
language = language_level_form['language']
level = language_level_form['level']
Job.objects.create(
customer=request.user,
text_to_translate=cleaned_data_job_creation_form['text_to_translate'],
file=cleaned_data_job_creation_form['file'],
short_description=cleaned_data_job_creation_form['short_description'],
notes=cleaned_data_job_creation_form['notes'],
language_from=cleaned_data_job_creation_form['language_from'],
language_to=language,
level=level,
)
return HttpResponseRedirect('/order-success')
file = cleaned_data_job_creation_form['file']
try:
count = utilities.docx_get_characters_number(file)
except utilities.UnknownCharactersNumberException:
count = 0
jobs = []
for language_level_form in [d for d in cleaned_data_language_level_formset if d]:
language = language_level_form['language']
level = language_level_form['level']
d={}
d['language_from']=cleaned_data_job_creation_form['language_from'].name
d['language_to']=language
d['number_of_characters']=count
d['price_per_sign']=LanguageLevel.objects.get(language=language,level=level).price_multiplier*AdminContact.objects.all()[0].price_per_sign
d['estimated_price']=count*d['price_per_sign']
jobs.append(d)
table = CreatedOrdersTable(jobs)
context = {'table':table}
return render(request, 'auth/jobs/confirm-order.html', context=context)