Python 如何在帖子中添加参数

Python 如何在帖子中添加参数,python,django,django-forms,django-views,Python,Django,Django Forms,Django Views,我正在尝试在Django中创建确认页面。我有一个视图,它呈现一个表单,然后用户单击提交,对象被保存到数据库中 我想做的是,当用户单击submit时,不要将对象保存到数据库中。我想呈现另一个页面,在那里用户可以确认他的订单,这样他就可以在那里看到他将要创建的所有对象,并单击确认 所以我创建了另一个视图,在提交表单时调用它。它应该显示一个包含数据的表,然后,如果用户单击“确认”,它应该保存对象。问题是-因为我正在调用视图并在那里传递一个旧请求,请求是POST,所以我无法检测单击提交和从旧视图重定向之

我正在尝试在
Django
中创建确认页面。我有一个
视图
,它呈现一个
表单
,然后
用户
单击
提交
,对象被保存到数据库中

我想做的是,当用户单击submit时,不要将对象保存到数据库中。我想呈现另一个页面,在那里用户可以确认他的订单,这样他就可以在那里看到他将要创建的所有对象,并单击
确认

所以我创建了另一个视图,在提交表单时调用它。它应该显示一个包含数据的表,然后,如果用户单击“确认”,它应该保存对象。问题是-因为我正在调用
视图
并在那里传递一个旧请求,请求是
POST
,所以我无法检测单击提交和从旧视图重定向之间的差异

因此,我可能需要在
请求中输入一个参数'confirm',然后发送到下一个
视图

通常,如果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)
这是一种新方法:

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)

有两种方法可以做到这一点:

(1) 使用“暂存”表/模型存储挂起的作业订单状态,而不采取任何实际操作来操作订单。这使用户能够返回他们的会话,或让您稍后向用户发送有关正在进行的工单等的提醒。如果您选择这种方式,按照标准准则保存到暂存模型对象,并返回重定向到视图,该视图将显示确认页面以及此暂存表的输出。提交最终订单后,您可以更新实际表并删除暂存表条目


(2)如果您不想使用上述方法,请考虑使用多步表单功能来使用会话后端存储临时状态,并将其转发到下一页,直到最终提交。如果不想手动执行此操作,请查看以下两种方法:

(1) 使用“暂存”表/模型存储挂起的作业订单状态,而不采取任何实际操作来操作订单。这使用户能够返回他们的会话,或让您稍后向用户发送有关正在进行的工单等的提醒。如果您选择这种方式,按照标准准则保存到暂存模型对象,并返回重定向到视图,该视图将显示确认页面以及此暂存表的输出。提交最终订单后,您可以更新实际表并删除暂存表条目


(2)如果您不想使用上述方法,请考虑使用多步表单功能来使用会话后端存储临时状态,并将其转发到下一页,直到最终提交。如果您不想手动完成此操作,请查看我建议的两个可能选项

  • 稍后可以使用request.session在会话访问中保存对象(请参阅)
  • 如果希望对象在多个视图中可用,可以使用模板上下文处理器(请参阅)

    • 我建议两种可能的选择是

      • 稍后可以使用request.session在会话访问中保存对象(请参阅)
      • 如果希望对象在多个视图中可用,可以使用模板上下文处理器(请参阅)

      您的问题是什么?主要问题是,当我从“创建订单”视图调用“确认订单”时,它会自动创建对象,我希望“确认订单”先呈现一个confirm-order.html,然后单击“确认”后,它会保存对象。所以问题是,在从create_order视图调用视图和单击confirm时,row if request.method=='POST'都被调用。我认为您应该将“return confirm_order(request,context)”更改为return HttpResponseRedirect(反向('name_of_of_your_confirm_view'))@ThinhPhan但我必须向confirm_order发送上下文。你的问题是什么?主要问题是,当我从create_order视图调用confirm_order时,它会自动创建对象,我希望confirm_order首先呈现confirm-order.html,然后单击confirm,它会保存对象。所以问题是,在从create_order视图调用视图和单击confirm时,都会调用row if request.method==“POST”。我认为您应该将“return confirm_order(request,context)”更改为return HttpResponseRedirect(reverse('name_of_your_confirm_view'))@ThinhPhan,但我必须将上下文发送到confirm_order。