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。