Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django使用具有多个表单的基于函数的视图填充表单_Python_Django_Forms_Django Views - Fatal编程技术网

Python Django使用具有多个表单的基于函数的视图填充表单

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

我将Django 2.1与Python3.6和postgreSQL一起使用

我必须在同一模板中显示3个不同的表单。因此,我创建了一个视图,在其中放置了3个表单,但这并没有显示它们的填充方式,就像使用带有
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)