【问题标题】:jinja2.exceptions.UndefinedError: 'form' is undefined using flask and WTFjinja2.exceptions.UndefinedError: 'form' 未使用烧瓶和 WTF 定义
【发布时间】:2020-05-13 17:38:42
【问题描述】:

我在烧瓶应用程序中有 WTF 表单,如果所有字段都正确,它可以正常工作。但是当我提交空表单时,会抛出 jinja2.exceptions.UndefinedError: 'form' is undefined 而不是显示验证错误。这是我的实现

class TwitterHandlerForm(FlaskForm):
first_name = StringField('First Name', validators=[DataRequired()])
last_name = StringField('Last Name', validators=[DataRequired()])
email = StringField('Email', validators=[DataRequired()])
social_type = SelectField('Social Network', coerce=int,
        choices=[(0, 'Please Select'), (1, 'Honda'),(2, 'Toyota')],
        validators=[DataRequired()])
handler = StringField('Handler / Instagram Page or User', validators=[DataRequired()])
twitter_id = IntegerField('Twitter Id', validators=[DataRequired(message= "Integers only")])
latitude = FloatField('Latitude', validators=[DataRequired(message="Decimal values only")])
longitude = FloatField('Longitude', validators=[DataRequired(message="Decimal values only")])
submit = SubmitField('Submit')

这是我的 HTML 表单

      <form id="edit_form" class="form-horizontal" role="form" action="" method="post" novalidate>
        <div class="form-group">
            <div class="form-group col-md-4">
                {{ crawler_form.hidden_tag() }}
                <div class="form-group col-md-12">
                    {{ crawler_form.first_name.label }}
                    {{ crawler_form.first_name(class_='form-control') }}

                    {% for error in crawler_form.first_name.errors %}
                    <span style="color: red;">[{{ error }}]</span>
                    {% endfor %}
                </div>

                <div class="form-group col-md-12">
                    {{ crawler_form.last_name.label }}
                    {{ crawler_form.last_name(class_='form-control') }}
                    {% if crawler_form.last_name.errors %}
                    <ul class="errors">{% for error in form.last_name.errors %}
                        <li>{{ error }}</li>
                        {% endfor %}
                    </ul>
                    {% endif %}
                </div>

                <div class="form-group col-md-12">
                    {{ crawler_form.email.label }}
                    {{ crawler_form.email(class_='form-control') }}
                    {% for error in crawler_form.email.errors %}
                    {% if crawler_form.email.errors %}
                    <ul class="errors">{% for error in form.email.errors %}
                        <li>{{ error }}</li>
                        {% endfor %}
                    </ul>
                    {% endif %}
                    {% endfor %}
                </div>

                <div class="form-group col-md-12">
                    {{ crawler_form.social_type.label }}
                    {{ crawler_form.social_type(class_='form-control') }}
                    {% for error in crawler_form.social_type.errors %}
                    <span style="color: red;">[{{ error }}]</span>
                    {% endfor %}
                </div>

                <div class="form-group col-md-12">
                    {{ crawler_form.handler.label }}
                    {{ crawler_form.handler(class_='form-control') }}
                    {% for error in crawler_form.handler.errors %}
                    <span style="color: red;">[{{ error }}]</span>
                    {% endfor %}
                </div>

                <div class="form-group col-md-12">
                    {{ crawler_form.twitter_id.label }}
                    {{ crawler_form.twitter_id(class_='form-control') }}
                    {% for error in crawler_form.twitter_id.errors %}
                    <span style="color: red;">[{{ error }}]</span>
                    {% endfor %}
                    <a href="http://gettwitterid.com" target="_blank">Get Twitter Id</a>
                </div>

                <div class="form-group col-md-12">
                    {{ crawler_form.latitude.label }}
                    {{ crawler_form.latitude(class_='form-control') }}
                    {% for error in crawler_form.latitude.errors %}
                    <span style="color: red;">[{{ error }}]</span>
                    {% endfor %}
                </div>

                <div class="form-group col-md-12">
                    {{ crawler_form.longitude.label }}
                    {{ crawler_form.longitude(class_='form-control') }}
                    {% for error in crawler_form.longitude.errors %}
                    <span style="color: red;">[{{ error }}]</span>
                    {% endfor %}
                </div>
                <div style="margin-top:10px" class="form-group">
                    <div class="col-sm-12 controls">
                        {{ crawler_form.submit(class='btn btn-warning') }}
                    </div>
                </div>
                <div style="margin-top:10px" class="form-group">
                    <div class="col-sm-12 controls">
                        {% with messages = get_flashed_messages() %}
                        {% if messages %}
                        <ul>
                            {% for message in messages %}
                            <li>
                                <div class="alert alert-danger" role="alert"> {{ message }}</div>
                            </li>
                            {% endfor %}
                        </ul>
                        {% endif %}
                        {% endwith %}
                        {% if crawler_form.errors %}
                        {{ crawler_form.errors }}
                        {% endif %}
                    </div>
                </div>
            </div>
        </div>

    </form>

并在提交表单时查看。

def edit():
    db_session = current_app.db.session
    user_id = request.args.get('id')
    form = TwitterHandlerForm()
    if user_id is not None and user_id != "":
        user = User.query.filter(
            (User.id == user_id) &
            (User.deleted == False)
        ).first()
        crawler = TwitterUsers.query.filter(
            (TwitterUsers.user_id == user_id)
        ).first()

        if form.validate_on_submit():
            user.first_name = form.first_name.data
            user.last_name = form.last_name.data
            user.email_address = form.email.data

            crawler.name = form.handler.data
            crawler.screen_name = form.handler.data
            crawler.twitter_id = form.twitter_id.data
            crawler.latitude = form.latitude.data
            crawler.longitude = form.longitude.data
            crawler.updated_at = datetime.datetime.utcnow()
            city,country = get_city_country(form.latitude.data,form.longitude.data)
            crawler.city = city
            crawler.country = country
            db_session.flush()
            db_session.commit()
            return redirect(url_for('twitter'))
        elif request.method == 'GET':
            form.first_name.data = user.first_name
            form.last_name.data = user.last_name
            form.email.data = user.email_address

            form.handler.data = crawler.name
            form.twitter_id.data = crawler.twitter_id
            form.latitude.data = crawler.latitude
            form.longitude.data = crawler.longitude
    else:
        if form.validate_on_submit():
            city, country = get_city_country(str(form.latitude.data), str(form.longitude.data))
            newUser = User(first_name=form.first_name.data, last_name=form.last_name.data,
                           email_address=form.email.data, enabled=True, deleted=False, verified=False,
                           auth_type='crawler')
            db_session.add(newUser)
            db_session.commit()
            user = User.query.filter(
                (User.email_address == form.email.data) &
                (User.deleted == False)
            ).first()
            newTwitter = TwitterUsers(user_id=user.id, name=form.handler.data, screen_name=form.handler.data,
                                      twitter_id=form.twitter_id.data, latitude=form.latitude.data,
                                      longitude=form.longitude.data,city=city,country=country)
            db_session.add(newTwitter)
            db_session.commit()
            return redirect(url_for('twitter'))
    return render_template('admin/edit_twitter_user.html', user=current_user, crawler_form=form)

这里是堆栈跟踪

 File "E:\Projects\PythonProjects\MyAppProd\app-pyvenv\Lib\site-packages\flask\app.py", line 2463, in __call__
    return self.wsgi_app(environ, start_response)
  File "E:\Projects\PythonProjects\MyAppProd\app-pyvenv\Lib\site-packages\flask\app.py", line 2449, in wsgi_app
    response = self.handle_exception(e)
  File "E:\Projects\PythonProjects\MyAppProd\app-pyvenv\Lib\site-packages\flask\app.py", line 1866, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "E:\Projects\PythonProjects\MyAppProd\app-pyvenv\Lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "E:\Projects\PythonProjects\MyAppProd\app-pyvenv\Lib\site-packages\flask\app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "E:\Projects\PythonProjects\MyAppProd\app-pyvenv\Lib\site-packages\flask\app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "E:\Projects\PythonProjects\MyAppProd\app-pyvenv\Lib\site-packages\flask\app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "E:\Projects\PythonProjects\MyAppProd\app-pyvenv\Lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "E:\Projects\PythonProjects\MyAppProd\app-pyvenv\Lib\site-packages\flask\app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "E:\Projects\PythonProjects\MyAppProd\app-pyvenv\Lib\site-packages\flask\app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "E:\Projects\PythonProjects\MyAppProd\app-pyvenv\Lib\site-packages\flask_login\utils.py", line 261, in decorated_view
    return func(*args, **kwargs)
  File "E:\Projects\PythonProjects\MyAppProd\app\util.py", line 220, in decorated
    return function(*args, **kwargs)
  File "E:\Projects\PythonProjects\MyAppProd\app\views\edit_twitter_user.py", line 80, in edit
    return render_template('admin/edit_twitter_user.html', user=current_user, crawler_form=form)
  File "E:\Projects\PythonProjects\MyAppProd\app-pyvenv\Lib\site-packages\flask\templating.py", line 137, in render_template
    return _render(
  File "E:\Projects\PythonProjects\MyAppProd\app-pyvenv\Lib\site-packages\flask\templating.py", line 120, in _render
    rv = template.render(context)
  File "E:\Projects\PythonProjects\MyAppProd\app-pyvenv\Lib\site-packages\jinja2\asyncsupport.py", line 76, in render
    return original_render(self, *args, **kwargs)
  File "E:\Projects\PythonProjects\MyAppProd\app-pyvenv\Lib\site-packages\jinja2\environment.py", line 1008, in render
    return self.environment.handle_exception(exc_info, True)
  File "E:\Projects\PythonProjects\MyAppProd\app-pyvenv\Lib\site-packages\jinja2\environment.py", line 780, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "E:\Projects\PythonProjects\MyAppProd\app-pyvenv\Lib\site-packages\jinja2\_compat.py", line 37, in reraise
    raise value.with_traceback(tb)
  File "E:\Projects\PythonProjects\MyAppProd\app\templates\admin\edit_twitter_user.html", line 2, in <module>
    {% import "bootstrap/wtf.html" as wtf %}
  File "E:\Projects\PythonProjects\MyAppProd\app-pyvenv\Lib\site-packages\jinja2\environment.py", line 1005, in render
    return concat(self.root_render_func(self.new_context(vars)))
  File "E:\Projects\PythonProjects\MyAppProd\app\templates\admin\edit_twitter_user.html", line 17, in root
    <div class="form-group col-md-12">
  File "E:\Projects\PythonProjects\MyAppProd\app\templates\base.html", line 50, in root
    <div class="navbar-header">
  File "E:\Projects\PythonProjects\MyAppProd\app\templates\admin\edit_twitter_user.html", line 52, in block_content
    {{ crawler_form.social_type(class_='form-control') }}
  File "E:\Projects\PythonProjects\MyAppProd\app-pyvenv\Lib\site-packages\jinja2\environment.py", line 430, in getattr
    return getattr(obj, attribute)
jinja2.exceptions.UndefinedError: 'form' is undefined

【问题讨论】:

    标签: flask jinja2 flask-wtforms


    【解决方案1】:

    将此行修正为正确的表单名称;)

     <ul class="errors">{% for error in form.last_name.errors %}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 2021-11-20
      • 2020-12-24
      • 2019-04-15
      相关资源
      最近更新 更多