You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:54:02