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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:48:02