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

