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

Django多表单关联:提交Form1后跳转Form2并关联外键的视图实现

先修正模型与表单的命名错误

你的代码存在模型类与引用不匹配的问题,先修正这些基础错误,否则后续视图会报错:

1. 修正模型代码

# models.py
from django import models

class Form1Model(models.Model):
    name = models.CharField(max_length=100)
    connection_type=models.CharField(max_length=100)
    
    def __str__(self) -> str:
        return self.name


class Form2Model(models.Model):
    name=models.CharField(max_length=100)
    protocol=models.CharField(max_length=5)
    # 外键引用修正为实际模型类Form1Model
    connection_name=models.ForeignKey(Form1Model, on_delete=models.CASCADE)
    
    def __str__(self) -> str:
        return self.name

2. 修正表单代码

# forms.py
from django import forms
from inventory.models import Form1Model, Form2Model

class Form1Form(forms.ModelForm):
    class Meta:
        model = Form1Model
        fields = "__all__"

class Form2Form(forms.ModelForm):
    class Meta:
        model = Form2Model
        # 对应模型的字段名connection_name,无需手动定义ModelChoiceField
        fields = ["connection_name", "name", "protocol"]

编写视图函数

需要两个视图分别处理两组表单的提交与关联逻辑:

1. 处理Form1提交并跳转至Form2

这个视图负责展示Form1表单,提交后保存实例,再携带实例ID跳转到Form2页面:

# views.py
from django.shortcuts import render, redirect, get_object_or_404
from .forms import Form1Form, Form2Form
from .models import Form1Model

def form1_view(request):
    if request.method == 'POST':
        form = Form1Form(request.POST)
        if form.is_valid():
            # 保存表单并获取Form1Model实例
            form1_instance = form.save()
            # 跳转到Form2视图,传入刚创建的实例ID
            return redirect('form2_view', form1_id=form1_instance.id)
    else:
        form = Form1Form()
    return render(request, 'form1.html', {'form': form})

2. 处理Form2提交并关联Form1实例

这个视图接收Form1的ID,自动将外键关联到对应实例,无需用户手动选择:

def form2_view(request, form1_id):
    # 获取刚创建的Form1Model实例(不存在则返回404)
    form1_instance = get_object_or_404(Form1Model, id=form1_id)
    
    if request.method == 'POST':
        form = Form2Form(request.POST)
        if form.is_valid():
            # 先不提交到数据库,手动设置外键关联
            form2_instance = form.save(commit=False)
            form2_instance.connection_name = form1_instance
            form2_instance.save()
            # 跳转至自定义成功页面(需自行配置对应视图和路由)
            return redirect('success_page')
    else:
        # 初始化表单时,默认选中对应的Form1实例
        form = Form2Form(initial={'connection_name': form1_instance})
    
    return render(request, 'form2.html', {'form': form, 'form1': form1_instance})

配置URL路由

在项目的urls.py中添加对应路由:

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('form1/', views.form1_view, name='form1_view'),
    path('form2/<int:form1_id>/', views.form2_view, name='form2_view'),
    # 可选:添加成功页面路由
    path('success/', views.success_view, name='success_page'),
]

模板示例(可选)

form1.html

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">提交并进入连接详情</button>
</form>

form2.html

<form method="post">
    {% csrf_token %}
    <!-- 若需隐藏外键选择框,可添加style="display:none" -->
    {{ form.as_p }}
    <button type="submit">保存连接详情</button>
</form>

额外优化

如果不想让用户看到外键选择框,可在Form2Form中将字段设为隐藏:

class Form2Form(forms.ModelForm):
    connection_name = forms.ModelChoiceField(
        queryset=Form1Model.objects.all(),
        widget=forms.HiddenInput()
    )
    class Meta:
        model = Form2Model
        fields = ["connection_name", "name", "protocol"]

内容的提问来源于stack exchange,提问作者Quantum-script

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:07:04