Flask使用WTForm开发表单时模板报form is undefined错误求助
问题根因
views.py中视图函数存在缩进错误,return render_template('contact.html')行未缩进在contact函数内部,同时渲染模板时未传递form对象到模板层,是触发form未定义报错的核心原因。- 模板
contact.html中调用了不存在的form.submit属性,你在forms.py中定义的提交按钮字段名为send,字段名不匹配会在修复form未定义问题后触发新的报错。 - 表单未加CSRF令牌,Flask-WTF默认开启CSRF校验,未添加令牌会导致后续表单提交校验失败。
- 你在
forms.py中导入了Email校验器,但未实际用到email字段上,校验逻辑不会生效。
修复后的代码
1. products/views.py
from flask import Blueprint, render_template, request from products.forms import ContactForm products_bp = Blueprint('products', __name__, template_folder='templates') @products_bp.route("/contact", methods=["GET", "POST"]) def contact(): form = ContactForm() if form.validate_on_submit(): name = form.name.data email = form.email.data message = form.message.data return name + email + message # 修正缩进 + 传递form对象到模板 return render_template('contact.html', form=form)
2. products/forms.py
from flask_wtf import FlaskForm from wtforms import StringField, TextAreaField, SubmitField from wtforms.validators import DataRequired, Email class ContactForm(FlaskForm): name = StringField('name', validators=[DataRequired()]) # 生效Email校验规则 email = StringField('email', validators=[DataRequired(), Email()]) message = TextAreaField('message', validators=[DataRequired()]) # 字段名修改为submit和模板调用保持一致,也可以不改这里,后续把模板里的form.submit改成form.send submit = SubmitField('send')
3. products/templates/contact.html
{% block content %} <h1>Contact</h1> <form action="{{ url_for('products.contact') }}" method="post"> {{ form.csrf_token }} <!-- 补充CSRF令牌,避免提交校验失败 --> {{ form.name }} {{ form.email }} {{ form.message }} {{ form.submit }} </form> {% endblock %}
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

