我在使用WTF-Forms获取HTML5 Datepicker以在Flask中为表单提供值时遇到问题。如果我将HTML5 DateField删除到普通的旧vanilla WTF-Forms DateField,那么相同的表单将按预期工作。
对于好奇:版本:Python 3.5.2,Flask:0.11.1,Flask-WTF:0.12
相关代码如下:
型号:
class Order(db.Model):
__tablename__ = 'orders'
paid_date = db.Column(db.DateTime, nullable=True)
表单不应该有所作为,但为了完整性,这里是order-update.html的片段:
<div class="form-group">
{{ form.paid_date.label }}
{% if form.paid_date.errors %}
{% for error in form.paid_date.errors %}
<p class="error-message">{{ error }}</p>
{% endfor %}
{% endif %}
{{ form.paid_date }}
</div>
最小控制器:
@app.route('/orders/update/<int:order_number>', methods=['GET', 'POST'])
def update_order(order_number):
order = Order.query.get(order_number)
if request.method == 'POST':
if not form.validate():
return render_template('update-order.html', form=form, order=order)
else:
form.populate_obj(order)
db.session.commit()
return redirect(url_for('user')
elif request.method == 'GET':
return render_template('update-order.html', form=form, order=order)
这适用于表单声明:
from flask_wtf import Form
from wtforms import DateField
class UpdateOrderForm(Form):
paid_date = DateField('Date Order Paid', format='%m/%d/%y',
render_kw={'placeholder': '6/20/15 for June 20, 2015'})
submit = SubmitField('Update Order')
以下内容将会中断:
from flask_wtf import Form
from wtforms.fields.html5 import DateField
class UpdateOrderForm(Form):
paid_date = DateField('Date Order Paid', format='%m/%d/%y',
render_kw={'placeholder': '6/20/15 for June 20, 2015'})
submit = SubmitField('Update Order')
为了描述行为,使用普通DateField
,我使用字符串输入呈现一个表单(它也显示了form.populate_obj()
之后应该允许我坚持的现值。新日期,例如9/12/16
,并且会将form.paid_date
传递回控制器,DateField
,其值为09/20/16
,form.paid_date.data=2016-09-20
。传递验证并提交给db。
当我切换到非常好的HTML5日期选择器时,我使用form.paid_date
呈现带有日期选择器的表单(我想将其设置为对象btw中的当前日期)如上所述,即DateField
和value
相同。但是,日期选择器显示mm/dd/yyyy
。因此,如果我手动或使用选择器输入09/20/2016
并提交,form.paid_date.data
会返回None
。此外,我有
process_errors = <class 'list'>: ['Not a valid date value']
raw_data = <class 'list'>: ['2016-09-20']
。
所以我看到数据被返回,但是没有通过表单处理,因此被放入数据槽。我可以编写代码从raw_data
中删除它,但我肯定错过了一些或者这是一个错误!?
答案 0 :(得分:6)
我发现在 Chrome浏览器中 raw_data
为['2011-01-01']
所以它与时间格式不符!
你应该改变它:
format='%Y-%m-%d',