Wtforms.fields.html5 DateField在Flask中不能作为普通的旧DateField工作

Sha*_*han 6 html5 datepicker python-3.x flask-wtforms

我在使用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)
Run Code Online (Sandbox Code Playgroud)

表格不应该有所作为,但为了完整性,这里是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>
Run Code Online (Sandbox Code Playgroud)

最小控制器:

@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)
Run Code Online (Sandbox Code Playgroud)

这适用于表单声明:

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')
Run Code Online (Sandbox Code Playgroud)

而以下将打破:

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')
Run Code Online (Sandbox Code Playgroud)

为了描述行为,使用plain DateField,我使用字符串输入呈现一个表单(它也显示当前值,因为它form.populate_obj()允许我坚持在新的日期,例如9/12/16,并且它传递回控制器with form.paid_date是a DateField,值为09/20/16,和form.paid_date.data=2016-09-20.这会传递验证并提交给db.

当我切换到HTML5日期选择器时,这将是非常好的,我渲染一个带有datepicker的表单(我想将其设置为对象btw中的当前日期),form.paid_date如上所述,即,DateFieldvalue相同.但是,日期选择器正在显示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但肯定我错过了一些或者这是一个错误!?

小智 7

我发现,在Chrome浏览器 raw_data['2011-01-01']如此不匹配的时间格式!

你应该改变它:

format='%Y-%m-%d',
Run Code Online (Sandbox Code Playgroud)