在djang中表单模板之间映射外键

2024-05-15 20:57:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我在django中使用多个表单,比如formA、formB、formC,其中formB和formC有formA的外键。每个表单都有提交按钮发布请求。所以我写了一个观点如下

在视图.py在

def mainview(request):
if request.method == 'POST':
    if 'form_a' in request.POST:
        a_form = FormA(request.POST, prefix = "a")
        b_form = FormB(prefix = "b")
        if a_form.is_valid():
            a = a_form.save()
            return render_to_response('myApp/formB.html', {'b_form': b_form,},context_instance=RequestContext(request))
        return render_to_response('myApp/formA.html',{'a_form':a_form,},context_instance=RequestContext(request))
    elif 'form_b' in request.POST:
        b_form = FormB(request.POST, prefix="b")
        c_form = FormB(prefix = "c")

        if b_form.is_valid():
            b_form.save()
            return render_to_response('myApp/formC.html', {'c_form': c_form,},context_instance=RequestContext(request))
        return render_to_response('myApp/formB',{'b_form':b_form,}, context_instance=RequestContext(request))
    else:
        c_form = FormC(request.POST, prefix = "c")
        if c_form.is_valid():
            c_form.save()
            return HttpResponse("Added successfully")
        return render_to_response('myApp/formC.html',{'c_form':c_form,}, context_instance=RequestContext(request))
else:
    a_form = ProjectForm(prefix = "a")
return render_to_response('myApp/formA.html', {'a_form':a_form,},context_instance=RequestContext(request))

其中form_a和form_b是模板中提交按钮的名称。上面的视图将外键显示为下拉列表。我的问题是,我需要外键作为标签或隐藏值,用户不应被允许选择外键。它应该自动从formA映射到formB和formC。 如果我在表单中排除foreignKey字段,如下所示

^{pr2}$

并按如下方式设置FK

if b_form.is_valid():
      b_form.save(commit=False)
      b_form.fkfield = a
      b_form.save()

在表b上请求.POST,它抛出以下错误

local variable 'a' referenced before assignment

我的问题是,对于每个POST请求,如何将foreignKey映射到其他表单?在


Tags: toinstanceformprefixreturnifresponserequest
2条回答

是的,我有一个解决方案,但不确定它是否标准。请张贴任何其他可能比这更好的答案。这是我的解决方案

在调用下一个表单时,解析保存的表单“a”,如下所示

if a_form.is_valid()
      aSaved = a_form.save()
      return render_to_response('myApp/formB.html', {'a_form':aSaved, 'b_form': b_form,},context_instance=RequestContext(request))

现在aSaved变量存储了模型值。在模板中(表单.html),将id作为隐藏输入传递。在其视图中,使用以下语句检索模型

^{pr2}$

其中id是隐藏的变量名。 记住要在fkfield的表单定义中排除它。在

这里这行a = a_form.save()只存在于第一个条件中,即if 'form_a' in request.POST: 因此,在执行第二个或第三个条件时,即对于b和c,它没有变量名a,所以抛出错误-local variable 'a' referenced before assignment

你也可以这样做,先把A表保存到A模式

然后编辑表单B和C以包含更新的隐藏值,属性相同。在

相关问题 更多 >