Django项目order_pdf路由NoReverseMatch反向匹配错误排查
错误成因汇总
- 模板上下文缺少可匹配的Info实例:你的
add_business_plan视图中,传递给模板的上下文里注释掉了Info相关参数,模板渲染时Info.id读取不到有效值,返回空字符串,导致反向路由匹配时空参数不符合路由规则报错。 - 表单提交后未捕获新创建的实例ID:
form.save()会直接返回刚存入数据库的Info模型对象,你当前代码没有接收这个返回值,提交成功后的模态框也无法拿到对应PDF的ID参数。 - 存在潜在字段不匹配问题:你的Info模型只有
name字段,但视图order_pdf、admin_order_pdf中调用了不存在的info.businessName属性,后续生成PDF时会触发额外报错。
修复步骤
1. 修改add_business_plan视图代码
def add_business_plan(request): if request.method == 'POST': form = infoForm(request.POST) if form.is_valid(): # 接收刚保存的Info实例 new_info = form.save() # 字段名和模型保持一致,替换为name business_name = form.cleaned_data.get('name') messages.success(request, f'PDF created for {business_name}!') # 将新实例传入模板上下文 return render(request, 'businessplan/businessplan.html', {'successful_submit': True, 'new_info': new_info}) else: form = infoForm() # 如果需要展示所有历史记录的下载链接,打开下方查询 info_list = Info.objects.all() return render(request, 'businessplan/businessplan.html', { 'form': form, 'successful_submit': False, 'info_list': info_list })
2. 调整模板路由引用写法
仅提交成功后展示当前记录的下载链接:
{% if successful_submit %} <a href="{% url 'businessplan:order_pdf' new_info.id %}">下载当前商业计划书PDF</a> {% endif %}
展示所有历史记录的下载链接:
{% for info in info_list %} <a href="{% url 'businessplan:order_pdf' info.id %}">下载{{info.name}}的商业计划书PDF</a> {% endfor %}
删除原有Info.id、obj.id等无效变量写法,变量名和视图传入的上下文参数保持一致。
3. 修复视图字段引用错误
将order_pdf、admin_order_pdf视图中所有info.businessName替换为info.name,和模型字段匹配。
可选优化:路由参数类型限制
将urls.py中<str:info_id>修改为<int:info_id>,和模型ID的数值类型匹配,过滤非法参数请求。
内容的提问来源于stack exchange,提问作者A_K
相关产品推荐
相关产品推荐

