【问题标题】:How can I called a view within another view django如何在另一个视图 django 中调用视图
【发布时间】:2022-01-16 13:54:38
【问题描述】:

目前,我有一个基本上关闭潜在客户的视图,这意味着它只是将信息从一个表(潜在客户)复制到另一个(交易),现在我真正想做的是在单击关闭后,用户被重定向到另一个页面,用户可以在其中更新一些条目(销售预测),我有一个更新潜在客户的视图,所以我认为我可以执行以下操作:

@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 中做到这一点,那么我做错了什么?,我如何在另一个函数中调用现有函数在视图中起作用?

【问题讨论】:

    标签: django django-views


    【解决方案1】:

    视图返回一个响应对象。在您当前的代码中,您正在调用第二个视图,但没有对其响应做任何事情。如果您只想显示静态内容(不是可能导致关注当前 URL 的操作的表单),您可以从第二个视图返回响应对象 - return update_forecast(request, id)

    但是由于您的第二个视图正在显示一个表单,因此您关心第二个表单中视图的操作是什么。典型的 Django 习惯用法是让表单提交到当前页面的 URL——如果你只是调用它并返回它的响应对象,这是行不通的。您可以自定义第二个视图中的操作,例如向视图添加可选参数,但表单处理的常用习惯是重定向到您希望在成功时显示的视图。就像您在 update_forecast 视图中所做的那样。像这样的:

    messages.success(request, 'You have successfully updated the status from open to Close')
    return redirect('update_forecast', lead_id=id)
    

    【讨论】:

    • 谢谢,我这样做了,但出现错误 - django.urls.exceptions.NoReverseMatch: Reverse for 'update_forecast' not found。 “update_forecast”不是有效的视图函数或模式名称。
    • 对不起,很明显,你不知道 URL 的名称,所以更改后它可以工作 --- 如果我将第三个参数添加到函数 redirect('update_forecast', lead_id= id, place),其中 place 是它来自哪个视图的指示符,这行得通吗?
    • 不是自动的 - 参数将用于尝试将视图名称解析为 URL,有关详细信息,请参阅文档:docs.djangoproject.com/en/4.0/topics/http/shortcuts/#redirect。如果您将 place 作为该视图的 URL 模式的一部分(可能是可选的),它会起作用。或者使用 reverse 获取基本 URL,然后在将其传递给 redirect 之前添加一个查询参数,尽管在构建目标 URL 方面需要小心谨慎。
    • 如果您确实将 lead_id=id, place=place 作为 URL 模式的一部分,您会希望 place 作为一个 kwarg 而不是一个基本 arg。但我可能会自己将其设置为查询参数,例如,这类似于登录系统在登录后将您发送回最初请求的页面。 stackoverflow.com/a/49957974/2337736 展示了一种将参数添加到任意 URL 的好方法,而不会冒编码错误的风险,使用通用但非标准库 requests 包。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2020-05-12
    • 2015-01-03
    • 2017-10-07
    • 1970-01-01
    • 2019-05-15
    相关资源
    最近更新 更多