Mim*_*imu 12 python validation flask wtforms
首先,我是python和Flask的新手,所以如果我的问题很愚蠢,我很抱歉.我搜索它但从未找到答案(我猜这应该是一个"简单"的答案).
我想在我的网站上添加一个联系页面,我找到了这个教程,所以我跟着它.一切正常,直到表单验证.我只使用Required,form.validate()总是返回false.如果我不触摸我的代码,并删除表单类中的每个Required,它工作正常,form.validate()返回true.
我真的不明白为什么,我读了很多应该使用validate_on_submit(),但是如果我使用它我会收到错误:*'ClassName'对象没有属性'validate_on_submit'*
这是代码的相关部分:
Index.py
@app.route('/contact', methods=['GET','POST'])
def contact():
form = ContactForm()
if request.method == 'POST':
if form.validate() == False:
flash('All Fields are required.')
return render_template('contact.html', form=form)
else:
return 'Form posted'
elif request.method == 'GET':
return render_template('contact.html', form=form)
Run Code Online (Sandbox Code Playgroud)
forms.py
from wtforms import Form, TextField, TextAreaField, SubmitField, validators,ValidationError
class ContactForm(Form):
name = TextField("Name", [validators.Required()])
email = TextField("Email")
subject = TextField("Subject")
message = TextAreaField("Message")
submit = SubmitField("Send")
Run Code Online (Sandbox Code Playgroud)
contact.html
<div id="contact">
{% for message in get_flashed_messages() %}
<div class="flash">{{ message }}</div>
{% endfor %}
<form action="{{ url_for('contact') }}" method=post>
{{ form.name.label }}
{{ form.name }}
{{ form.email.label }}
{{ form.email }}
{{ form.subject.label }}
{{ form.subject }}
{{ form.message.label }}
{{ form.message }}
{{ form.submit }}
</form>
</div>
Run Code Online (Sandbox Code Playgroud)
即使我在"名称"字段中写了一些内容,我也从未获得"表单已发布"字符串.
提前致谢,
小智 20
当我在Miguel Grinberg的书"Flask Web Development"中按照演示代码测试登录表单时,我总是无法使用form.validate_on_submit().所以我想我应该找到一种调试方法.
我正在采取的调试方法是将以下代码添加到app/auth/views.py:
flash(form.errors)
Run Code Online (Sandbox Code Playgroud)
然后,当我跑到登录页面时,它向我展示了罪魁祸首:
errors={'csrf_token': ['CSRF token missing']}
Run Code Online (Sandbox Code Playgroud)
所以我建议使用form.errors消息进行调试.
cod*_*ape 10
您必须使用请求中的值初始化表单实例:
from flask import request
@app.route('/contact', methods=['GET','POST'])
def contact():
form = ContactForm(request.form)
if request.method == "POST" and form.validate():
# do something with form
# and probably return a redirect
return render_template("contact.html", form=form)
Run Code Online (Sandbox Code Playgroud)
这是一个比你在问题中链接的教程更好的教程:http://flask.pocoo.org/docs/patterns/wtforms/.
看一下教程中的模板渲染代码,确保渲染表单字段错误.如果表单已发布但未验证,则代码将render_template覆盖包含字段验证错误的表单实例(有关详细信息,请参阅教程和WTForms文档).
刚遇到问题,解决方案是hidden_tag在模板中的表单下方添加:
...
<form action="{{ url_for('contact') }}" method=post>
{{ form.hidden_tag() }}
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16764 次 |
| 最近记录: |