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

Flask+PostgreSQL CRUD应用更新操作报错:jinja2.exceptions.UndefinedError: 'intern_to_update' is undefined

问题诊断与修复方案

首先,你的报错jinja2.exceptions.UndefinedError: 'intern_to_update' is undefined不是来自update视图函数本身,而是来自你的base.html模板里的全局导航链接!

错误根源

看一下base.html里的这段代码:

<li class="nav-item">
    <a class="nav-link" href="{{url_for('update', intern_id = intern_to_update.intern_id)}}">Update</a>
</li>

这个链接试图使用intern_to_update变量,但这个变量只有在访问/update/<intern_id>页面时,才会由update视图函数传递给模板。而当你访问其他页面(比如/successful,也就是创建实习生后跳转的页面)时,模板渲染base.html时根本没有intern_to_update这个变量,Jinja2自然会报错。

而且这个全局的更新链接本身逻辑就有问题:更新操作必须针对某个具体的实习生,你总不能在导航栏放一个不知道要更新谁的链接吧?

修复步骤

1. 移除base.html中的全局更新链接

把base.html里那个导航栏的Update链接删掉,它不属于全局导航,应该放在每个实习生的条目旁边。

2. 在successful.html中为每个实习生添加更新链接

在successful.html里,你遍历所有实习生的地方,给每个实习生加上对应的更新按钮/链接:

<!-- 在successful.html的interns遍历循环里 -->
{% for intern in interns %}
  <div class="intern-item">
    <p>ID: {{ intern.intern_id }} | Name: {{ intern.intern_name }}</p>
    <a href="{{ url_for('update', intern_id=intern.intern_id) }}" class="btn btn-sm btn-primary">Update This Intern</a>
  </div>
{% endfor %}

这样每个链接都会指向对应实习生的更新页面,而且渲染时用的是当前循环的intern变量,不会出现未定义的问题。

3. 修复update.html中的字段名错误

另外,你的update.html里表单输入框的value属性写错了:

<input type="text" placeholder="Intern Name" name="name" value="{{intern_to_update.name}}">

你的Intern模型里的字段是intern_name,不是name,所以应该改成:

<input type="text" placeholder="Intern Name" name="name" value="{{intern_to_update.intern_name}}">

不然打开更新页面时,输入框里不会显示当前实习生的名字。

验证修复

做完这些修改后:

  • 访问/successful页面,每个实习生条目旁边会有对应的更新链接
  • 点击链接会跳转到该实习生的更新页面,此时update视图函数会传递intern_to_update变量给update.html,不会报错
  • 更新页面的输入框会正确显示当前实习生的名字,提交后能正常更新

内容的提问来源于stack exchange,提问作者kelhoney

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:32:26