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

时间:2014-04-09 07:05:05

标签: python django forms

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

views.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。 如果我从表单中的display中排除foreignKey字段,如下所示

class Meta:
      model = modelB
      exclude = ['fkfield']

并将FK设置如下

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

在form_b request.POST上,它会抛出以下错误

local variable 'a' referenced before assignment

我的问题是如何引用或如何将foreignKey映射到每个POST请求的其他表单?

2 个答案:

答案 0 :(得分:0)

此处此行a = a_form.save()仅存在于第一个条件中,即if 'form_a' in request.POST: 因此,在执行第二个或第三个条件时,即对于b和c,它的变量名称不是a,因此它会抛出错误 - local variable 'a' referenced before assignment

虽然你可以这样做,首先将表格A保存到模态A,

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

答案 1 :(得分:0)

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

解析,保存form_a变量'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变量已存储模型值。在模板(formB.html)中,将id作为隐藏输入传递。在其视图中,使用以下语句

检索模型
modelA = get_object_or_404(ModelA, pk=request.POST.get('id'))
if b_form.is_valid():
     b_form.save(commit = False)
     b_form.instance.fkfield = modelA
     b_form.save()

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