2016-06-06 2 views
1

Я пытаюсь создать страницу подтверждения в 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) 
+0

И каков ваш вопрос? –

+0

Основная проблема заключается в том, что когда я вызываю confirm_order из представления create_order, он автоматически создает объекты, я хочу, чтобы confirm_order сначала отображал файл confirm-order.html, и после нажатия «Подтвердить» он сохранял объекты. Таким образом, проблема заключается в том, что строка, если request.method == 'POST' вызывается одновременно, - когда представление вызывается из представления create_order и когда нажимается подтверждение. –

+0

Я думаю, вы должны изменить «return confirm_order (request, context)», чтобы вернуть HttpResponseRedirect (reverse ('name_of_your_confirm_view')) –

ответ

0

Существует два способа сделать это:

(1) Используйте таблицу/модель для постановки на охрану, чтобы сохранить состояние незавершенного заказа, не предпринимая никаких действительных действий для действия заказа. Это дает возможность пользователю вернуться на свою сессию или отправить сообщение пользователю позже о выполняемом задании и т. Д. Если вы решите сделать это таким образом, следуйте стандартным рекомендациям, чтобы сохранить объект промежуточной модели и возвратите перенаправление на представление, которое представит страницу подтверждения с результатами из этой промежуточной таблицы. После отправки окончательного заказа вы можете обновить фактическую таблицу и удалить запись промежуточной таблицы.

(2) Если вы не хотите использовать описанный выше метод, рассмотрите возможность использования многоступенчатой ​​формы для использования бэкэнда сеанса для хранения промежуточного состояния и пересылки его на следующую страницу до окончательного отправки. Если вы не хотите, чтобы сделать это вручную, проверьте django-formtools

0

Два возможных варианта я бы предложил бы

Смежные вопросы