Python Django使用具有多个表单的基于函数的视图填充表单
我将Django 2.1与Python3.6和postgreSQL一起使用 我必须在同一模板中显示3个不同的表单。因此,我创建了一个视图,在其中放置了3个表单,但这并没有显示它们的填充方式,就像使用带有Python Django使用具有多个表单的基于函数的视图填充表单,python,django,forms,django-views,Python,Django,Forms,Django Views,我将Django 2.1与Python3.6和postgreSQL一起使用 我必须在同一模板中显示3个不同的表单。因此,我创建了一个视图,在其中放置了3个表单,但这并没有显示它们的填充方式,就像使用带有generic.UpdateView的CBV一样 我需要在每个表单字段中添加正在更新的模型的当前信息 我还创建了这个,因为我没有找到很多关于如何在Django中创建具有多个表单的FBV的信息。我想,在这个观点中,几乎没有不正确的事情,所以所有的建议都是受欢迎的 观点: def project_up
generic.UpdateView
的CBV一样
我需要在每个表单字段中添加正在更新的模型的当前信息
我还创建了这个,因为我没有找到很多关于如何在Django中创建具有多个表单的FBV的信息。我想,在这个观点中,几乎没有不正确的事情,所以所有的建议都是受欢迎的
观点:
def project_update_view(request, pk):
project = Project.objects.get(pk=pk)
if request.method == 'POST':
general_form = UpdateProjectGeneralForm(request.POST)
investment_form = UpdateProjectInvestorDetailsForm(request.POST)
create_job_form = UpdateProjectAddWorkersForm(request.POST)
if general_form.is_valid():
general_form.instance.user = request.user
general_form.instance.history_change_reason = 'Project Updated'
general_form.save()
messages.success(request, 'Project updated!')
return HttpResponseRedirect(request.path_info)
if investment_form.is_valid():
investment_form.instance.user = request.user
investment_form.instance.history_change_reason = 'Investor Details Updated'
investment_form.save()
messages.success(request, 'Investment details updated!')
return HttpResponseRedirect(request.path_info)
if create_job_form.is_valid():
create_job_form.instance.project = project
create_job_form.instance.history_change_reason = 'New Job Added'
create_job_form.save()
messages.success(request, 'Job created!')
return HttpResponseRedirect(request.path_info)
else:
general_form = UpdateProjectGeneralForm()
investment_form = UpdateProjectInvestorDetailsForm()
create_job_form = UpdateProjectAddWorkersForm()
return render(request, 'webplatform/project_edit.html', {
'general_form': general_form,
'investment_form': investment_form,
'create_job_form': create_job_form,
'project': project,
})
表单:(为了避免额外的代码,我只放了一个表单。其他表单的结构相同)
模板:(这是其中一个表单,但它们都遵循相同的结构)
{%csrf_令牌%}
{{投资形式.投资金额{as|u crispy_field}}
{{投资形式.投资百分比{as|u crispy_field}}
{{投资形式.投资者详细信息{如{crispy_field}}
更新投资详情
正如@mfackowiak在评论中所说的,问题是我的表单没有与我想要编辑的模型实例化,所以我只需更改以下内容:
general_form = UpdateProjectGeneralForm(request.POST)
investment_form = UpdateProjectInvestorDetailsForm(request.POST)
create_job_form = UpdateProjectAddWorkersForm(request.POST)
为此:
general_form = UpdateProjectGeneralForm(request.POST, instance=project)
investment_form = UpdateProjectInvestorDetailsForm(request.POST, instance=project)
create_job_form = UpdateProjectAddWorkersForm(request.POST)
另外,我看到我可以使用get\u object\u或_404
调用该对象,因此我在第一行使用它,并由此:
project = Project.objects.get(pk=pk)
我明白了:
project = get_object_or_404(Project, pk=pk)
我认为使用单独的
元素是行不通的,因为提交表单必然会重新加载页面(假设没有指向不同端点的action
属性),并且只发送该表单中的数据作为POST负载。因此,每当您提交一个表单时,request.POST
只包含该表单中的数据,其他任何内容都会丢失(因此不会填充)。没有理由不能将多个Django表单作为一个html表单的一部分,只包含一个提交按钮和一个处理所有表单的视图函数。没错,提交按钮没有问题,我将编辑我的问题,重点关注填充部分。非常感谢。是否仅在所有表单都有效时保存,还是也欢迎部分保存?您完全可以/应该做的一件事是将您的实例作为instance=Project
传递给表单(如果它们是用于Project
model)。我想一次只保存一个。我现在唯一想做的就是用它们各自的当前信息填充它们。@mfrackowiak我今天再次检查了您告诉我要做的事情,现在我知道了,对不起。你说得对极了!我需要在表单上实例化项目。我将把解决方案添加到帖子并关闭它。非常感谢你!
project = Project.objects.get(pk=pk)
project = get_object_or_404(Project, pk=pk)