我正在使用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请求的其他表单?
答案 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。