如何在同一个Django HTML页面中展示两个不同的ModelForm类
问题核心原因
你遇到的问题来自两点:1. 视图传递给模板的两个表单实例用了相同的变量名,导致模板渲染时两次读取的都是同一个表单对象;2. 提交时没有标识区分当前提交的是哪个表单,后端无法对应处理。
第一步:修改视图层逻辑(views.py)
给两个表单设置不同的上下文变量名,同时通过提交按钮的标识区分要处理的表单:
from django.shortcuts import render, redirect from .forms import CompanyForm, ToyForm def your_view(request): # 初始化两个空表单,使用不同的变量名 company_form = CompanyForm() toy_form = ToyForm() if request.method == "POST": # 根据submit按钮的name判断提交的是哪个表单 if "company_submit" in request.POST: company_form = CompanyForm(request.POST) if company_form.is_valid(): company_form.save() return redirect("你配置的跳转路由名") elif "toy_submit" in request.POST: toy_form = ToyForm(request.POST) if toy_form.is_valid(): toy_form.save() return redirect("你配置的跳转路由名") # 传递两个不同命名的表单到模板上下文 context = { "company_form": company_form, "toy_form": toy_form } return render(request, "你的模板文件名.html", context)
第二步:修改模板代码
替换渲染变量名,同时给提交按钮加上唯一的name属性:
<form method="post"> {% csrf_token %} <h2> Company Form </h2> {{ company_form.as_p }} <input type="submit" name="company_submit" value="Submit" /> </form> <form method="post"> {% csrf_token %} <h2> Toy Form </h2> {{ toy_form.as_p }} <input type="submit" name="toy_submit" value="Submit" /> </form>
补充说明
如果你需要两个表单同时提交(一次请求同时创建Company和Toy两条记录),可以去掉submit按钮的name区分,POST时同时实例化两个表单分别验证保存即可,只要保证变量名不重复就能正常渲染。
内容的提问来源于stack exchange,提问作者Gaius G D'cruz
相关产品推荐
相关产品推荐

