【发布时间】: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