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
相关产品推荐
相关产品推荐

