Flask联系表单报错jinja2 UndefinedError无message属性排查
Flask联系表单
form.message属性不存在报错修复 报错信息
UndefinedError jinja2.exceptions.UndefinedError: 'forms.ContactForm object' has no attribute 'message'
问题排查
- 直接触发报错的原因:模板文件
contact.html中存在遍历form.message.errors的逻辑,但forms.py里定义的ContactForm类没有声明message字段,Jinja2渲染时找不到对应属性直接抛出未定义错误。 - 代码中同时存在其他会导致表单功能失效的问题:
- 路由判断请求方式逻辑错误:
if request.form == 'POST'写法无效,正确判断对象是request.method - 表单验证调用错误:
form.validate是类方法,必须加括号执行才会返回验证结果,直接写属性名永远不会触发验证逻辑 - 模板拼写错误:所有字段的标签属性被错写为
lable,正确拼写为label - 模板方法调用错误:
form.hidden_tag是渲染CSRF隐藏字段的方法,必须加括号调用才会输出实际HTML内容 - 表单类中定义的
language字段未在模板中渲染,提交时会触发缺失字段的验证错误
- 路由判断请求方式逻辑错误:
修复步骤
- 处理核心报错
如果你不需要留言输入项,直接删除模板中遍历form.message.errors的整段代码即可;如果需要留言功能,先在forms.py的ContactForm类中补充字段定义:# 加在ContactForm类的字段定义区域 message = TextAreaField('Message', [validators.DataRequired('Please enter your message')]) - 修正路由逻辑
把first.py中contact路由的逻辑改为正确写法,推荐直接使用Flask-WTF封装的validate_on_submit()方法,同时完成请求方式判断和表单验证:@app.route('/contact', methods=['POST', 'GET']) def contact(): form = ContactForm() if form.validate_on_submit(): # 验证通过后的逻辑 return 'Success' # GET请求或验证失败时都渲染表单 flash('Fill all the fields') return render_template('contact.html', form=form) - 修正模板错误
把模板中所有lable拼写改为label,给hidden_tag加上括号,补充缺失的language字段渲染(如果加了message字段也同步补上渲染代码),修正后的表单核心代码如下:<form action="/contact" method="post"> <fieldset> <legend>Contact Form</legend> {{ form.hidden_tag() }} {{ form.name.label }} {{ form.name }} <br> {{ form.gender.label }} {{ form.gender }} <br> {{ form.address.label }} {{ form.address }} <br> {{ form.email.label }} {{ form.email }} <br> {{ form.age.label }} {{ form.age }} <br> {{ form.language.label }} {{ form.language }} <br> <!-- 新增message字段后放开下面两行 {{ form.message.label }} {{ form.message }} <br> --> {{ form.submit }} </fieldset> </form>
注意:如果删除了
message字段,记得同步删掉模板里对应的错误遍历代码,否则还是会触发属性不存在的报错。
内容的提问来源于stack exchange,提问作者Mohammad Javidi
相关产品推荐
相关产品推荐

