【发布时间】:2017-10-09 01:31:40
【问题描述】:
我在表单验证方面遇到问题。国家/地区列表生成正确,以前的表格工作正常。它只是中断 POST 请求。
这是我的forms.py:
from wtforms import Form, BooleanField, SelectField, \
StringField, PasswordField, SubmitField, validators, \
RadioField
from ..models import User
from pycountry import countries
...
## Account settings
# We get all COUNTRIES
COUNTRIES = [(c.name, c.name) for c in countries]
# edit profile
class ProfileForm(Form):
username = StringField('name',[validators.Length(min=1, max=120), validators.InputRequired])
email = StringField('email', [validators.Length(min=6, max=120), validators.Email()])
company = StringField('name',[validators.Length(min=1, max=120)])
country = SelectField('country', choices=COUNTRIES)
news = BooleanField('news')
这是视图:
@user.route('/profile/', methods=['GET', 'POST'])
@login_required
def profile():
userid = current_user.get_id()
user = User.query.filter_by(id=userid).first_or_404()
print(user)
form = ProfileForm(request.form)
if request.method == 'POST' and form.validate():
user.username = form.username.data
...
return render_template('settings.html', form=form )
else:
form.username.data = user.username
...
return render_template('settings.html', form=form )
【问题讨论】:
-
在 settings.html 我使用 {{ form.field}} 来生成每个表单字段
-
尝试
form = ProfileForm(request.POST)而不是ProfileForm(request.form)。如果您提供堆栈跟踪的其余部分会有所帮助 -
我不工作。这是堆栈跟踪:pastebin.com/Lq00syTz
-
如果我打印 form.data 一切似乎都很好:{'news': True, 'username': 'asdf', 'country': 'Aruba', 'company': 'asDf', '电子邮件':'asdf@asdf.com'}
-
检查 form.errors 字典,看看它是否包含任何内容。它可能缺少 CSRF 密钥