我怎样才能在另一个视图 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)