我怎样才能在另一个视图 django 中调用一个视图
How can I called a view within another view django
目前,我有一个观点基本上关闭了一个潜在客户,这意味着它只是将信息从一个 table(潜在客户)复制到另一个(交易),现在我真正想做的是单击关闭后,用户将被重定向到另一个页面,用户可以在其中更新一些条目(销售预测),我有一个更新潜在客户的视图,所以我认为我可以执行如下操作:
@login_required
def close_lead(request):
id = request.GET.get('project_id', '')
keys = Leads.objects.select_related().get(project_id=id)
form_dict = {'project_id': keys.project_id,
'agent': keys.agent,
'client': keys.point_of_contact,
'company': keys.company,
'service': keys.services,
'licenses': keys.expected_licenses,
'country_d': keys.country
}
deal_form = NewDealForm(request.POST or None,initial=form_dict)
if request.method == 'POST':
if deal_form.is_valid():
deal_form.save()
obj = Leads.objects.get(project_id=id)
obj.status = "Closed"
obj.save(update_fields=['status'])
## Changing the Forecast Table Entry
forecast = LeadEntry.objects.filter(lead_id=id)
for i in forecast:
m = i
m.stage = "Deal"
m.save(update_fields=['stage'])
messages.success(request, 'You have successfully updated the status from open to Close')
update_forecast(request,id)
else:
messages.error(request, 'Error updating your Form')
return render(request,
"account/close_lead.html",
{'form': deal_form})
此视图提供了我要在关闭潜在客户后更新的表单集
@login_required
def update_forecast(request,lead_id):
# Gets the lead queryset
lead = get_object_or_404(Leads,pk=lead_id)
#Create an inline formset using Leads the parent model and LeadEntry the child model
FormSet = inlineformset_factory(Leads,LeadEntry,form=LeadUpdateForm,extra=0)
if request.method == "POST":
formset = FormSet(request.POST,instance=lead)
if formset.is_valid():
formset.save()
return redirect('forecast_lead_update',lead_id=lead.project_id)
else:
formset = FormSet(instance=lead)
context = {
'formset':formset
}
return render(request,"account/leadentry_update.html",context)
如您所见,我在验证表单中的数据后调用此函数 update_forecast(request,id),我本以为会以某种方式重定向到 HTML 页面在该函数上指定,但是,在单击提交后,第一个视图中的表单得到验证,但随后什么也没有发生,所以我的函数没有呈现 HTML 页面
我的问题是如何在我的视图中利用现有函数?显然,我会想象遵循 DRY 原则你可以在 Django 中做到这一点,那么我做错了什么?我如何调用现有函数在视图的另一个函数中?
一个视图return是一个响应对象。在您当前的代码中,您正在调用第二个视图但不对其响应执行任何操作。如果您只想显示静态内容(而不是可能导致关注当前 URL 的操作的表单),您可以 return 来自第二个视图的响应对象 - return update_forecast(request, id)
。
但是由于您的第二个视图显示的是一个表单,您关心的是第二个表单中的视图的操作是什么。典型的 Django 习惯用法是让表单提交到当前页面的 URL - 如果您只是调用它和 return 它的响应对象,那将不起作用。您 可以 自定义第二个视图中的操作,比如向视图添加一个可选参数,但表单处理的常用习惯是重定向到您想要在成功时显示的视图。正如您在 update_forecast
视图中所做的那样。像这样:
messages.success(request, 'You have successfully updated the status from open to Close')
return redirect('update_forecast', lead_id=id)
目前,我有一个观点基本上关闭了一个潜在客户,这意味着它只是将信息从一个 table(潜在客户)复制到另一个(交易),现在我真正想做的是单击关闭后,用户将被重定向到另一个页面,用户可以在其中更新一些条目(销售预测),我有一个更新潜在客户的视图,所以我认为我可以执行如下操作:
@login_required
def close_lead(request):
id = request.GET.get('project_id', '')
keys = Leads.objects.select_related().get(project_id=id)
form_dict = {'project_id': keys.project_id,
'agent': keys.agent,
'client': keys.point_of_contact,
'company': keys.company,
'service': keys.services,
'licenses': keys.expected_licenses,
'country_d': keys.country
}
deal_form = NewDealForm(request.POST or None,initial=form_dict)
if request.method == 'POST':
if deal_form.is_valid():
deal_form.save()
obj = Leads.objects.get(project_id=id)
obj.status = "Closed"
obj.save(update_fields=['status'])
## Changing the Forecast Table Entry
forecast = LeadEntry.objects.filter(lead_id=id)
for i in forecast:
m = i
m.stage = "Deal"
m.save(update_fields=['stage'])
messages.success(request, 'You have successfully updated the status from open to Close')
update_forecast(request,id)
else:
messages.error(request, 'Error updating your Form')
return render(request,
"account/close_lead.html",
{'form': deal_form})
此视图提供了我要在关闭潜在客户后更新的表单集
@login_required
def update_forecast(request,lead_id):
# Gets the lead queryset
lead = get_object_or_404(Leads,pk=lead_id)
#Create an inline formset using Leads the parent model and LeadEntry the child model
FormSet = inlineformset_factory(Leads,LeadEntry,form=LeadUpdateForm,extra=0)
if request.method == "POST":
formset = FormSet(request.POST,instance=lead)
if formset.is_valid():
formset.save()
return redirect('forecast_lead_update',lead_id=lead.project_id)
else:
formset = FormSet(instance=lead)
context = {
'formset':formset
}
return render(request,"account/leadentry_update.html",context)
如您所见,我在验证表单中的数据后调用此函数 update_forecast(request,id),我本以为会以某种方式重定向到 HTML 页面在该函数上指定,但是,在单击提交后,第一个视图中的表单得到验证,但随后什么也没有发生,所以我的函数没有呈现 HTML 页面
我的问题是如何在我的视图中利用现有函数?显然,我会想象遵循 DRY 原则你可以在 Django 中做到这一点,那么我做错了什么?我如何调用现有函数在视图的另一个函数中?
一个视图return是一个响应对象。在您当前的代码中,您正在调用第二个视图但不对其响应执行任何操作。如果您只想显示静态内容(而不是可能导致关注当前 URL 的操作的表单),您可以 return 来自第二个视图的响应对象 - return update_forecast(request, id)
。
但是由于您的第二个视图显示的是一个表单,您关心的是第二个表单中的视图的操作是什么。典型的 Django 习惯用法是让表单提交到当前页面的 URL - 如果您只是调用它和 return 它的响应对象,那将不起作用。您 可以 自定义第二个视图中的操作,比如向视图添加一个可选参数,但表单处理的常用习惯是重定向到您想要在成功时显示的视图。正如您在 update_forecast
视图中所做的那样。像这样:
messages.success(request, 'You have successfully updated the status from open to Close')
return redirect('update_forecast', lead_id=id)