Django传递ForeignKey到页面关联数据时报project_id缺失错误如何解决?
Django多模型关联数据新增报错解决方案
错误根因
- 前端模板
url标签语法错误,参数未正确传递到路由 - 视图层表单
instance参数传值错误,Fundamentals模型表单错误传入了Project模型实例 - 路由参数未指定类型,且缺少规范的结尾斜杠,易触发Django自动重定向导致参数丢失
- 重定向目标配置错误,
redirect方法不能直接传入模板文件名
分步修改方案
1. 修复前端跳转链接
将原跳转链接修改为正确的url标签语法,参数放在路由名称外侧:
<a class="dropdown-item" href="{% url 'add_fundamentals' project.id %}">Critical Fundamentals</a>
2. 优化路由配置
给project_id指定整数类型约束,添加结尾斜杠符合Django路由规范:
path('fundamentals/<int:project_id>/', view=AddFundamentals, name="add_fundamentals"),
3. 修正视图逻辑
修改表单初始化与保存逻辑,手动关联Fundamentals和对应Project实例:
@login_required def AddFundamentals(request, project_id): project = Project.objects.get(pk=project_id) if request.method == 'POST': form = AddFundamentalsForm(request.POST) if form.is_valid(): # 暂不提交到数据库,先手动绑定关联项目 fundamentals_obj = form.save(commit=False) fundamentals_obj.project_name = project fundamentals_obj.save() # 替换为你后台仪表盘对应的路由name,不可直接写模板名 return redirect('dashboard') else: # GET请求时给表单设置项目初始值,避免用户手动选择 form = AddFundamentalsForm(initial={'project_name': project}) return render(request, 'pages/critical_fundementals.html', {'project': project, "form": form})
4. 可选优化:表单隐藏关联字段
如果不需要用户手动选择关联项目,可在表单中隐藏外键字段,避免误操作:
class AddFundamentalsForm(forms.ModelForm): class Meta: model = Fundamentals fields = '__all__' widgets = { 'project_name': forms.HiddenInput() }
修改后模板中可直接通过{{ project.project_name }}显示当前项目名称,提交的表单数据会自动关联到对应项目。
内容的提问来源于stack exchange,提问作者JacksWastedLife
相关产品推荐
相关产品推荐

