Я пытаюсь создать страницу подтверждения в Django
. У меня есть один view
, который отображает form
, затем user
нажимает на Submit
и объекты сохраняются в базе данных.Как добавить параметры в POST
Что я хочу сделать, это не сохранять объекты в базе данных, когда пользователь нажимает кнопку «Отправить». Я хочу отобразить другую страницу, где пользователь может подтвердить свой заказ, чтобы он мог видеть все объекты, которые он создал, и нажмите на confirm
.
Итак, я создал другое представление, которое вызывается при отправке формы. Он должен показывать таблицу с данными, а затем, если пользователь нажимает на Confirm
, он должен сохранять объекты. Проблема в том, что, поскольку я вызываю view
и передаю туда старый запрос, запрос POST
, поэтому я не могу обнаружить разницу между кликом на отправке и перенаправлением из старого представления.
Поэтому мне, вероятно, нужно будет поставить параметр «подтвердить» на request
. Я отправляю на следующий view
.
Обычно, я бы поставил там if request.method == 'POST'
> сохранить объекты else
делают таблицу со значениями
Это оригинальный вид, который делает форму сохранить объекты:
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)
Это новый подход:
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)
И каков ваш вопрос? –
Основная проблема заключается в том, что когда я вызываю confirm_order из представления create_order, он автоматически создает объекты, я хочу, чтобы confirm_order сначала отображал файл confirm-order.html, и после нажатия «Подтвердить» он сохранял объекты. Таким образом, проблема заключается в том, что строка, если request.method == 'POST' вызывается одновременно, - когда представление вызывается из представления create_order и когда нажимается подтверждение. –
Я думаю, вы должны изменить «return confirm_order (request, context)», чтобы вернуть HttpResponseRedirect (reverse ('name_of_your_confirm_view')) –