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

Posted

技术标签:

【中文标题】Wtforms.fields.html5 DateField 在 Flask 中不能作为普通的旧 DateField 工作【英文标题】:Wtforms.fields.html5 DateField not working as plain old DateField in Flask 【发布时间】:2017-01-20 10:29:09 【问题描述】:

我在让 html5 Datepicker 使用 WTF-Forms 为 Flask 中的表单提供值时遇到问题。如果我将 HTML5 DateField 放到一个普通的老式 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 中的 sn-p:

    <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_dateDateField,值为 09/20/16form.paid_date.data=2016-09-20。这将通过验证并提交到数据库。

当我切换到 HTML5 日期选择器时,这将是非常好的,我呈现一个带有 form.paid_date 的日期选择器(我想将它设置为对象中的当前日期)的表单,如上,即DateField和与value一样。但是,日期选择器显示mm/dd/yyyy。因此,如果我手动或使用选择器输入09/20/2016 并提交,form.paid_date.data 会返回None。此外,我有

process_errors = &lt;class 'list'&gt;: ['Not a valid date value']

raw_data = &lt;class 'list'&gt;: ['2016-09-20']

所以我看到数据被返回,但没有通过表单处理,因此被放入数据槽中。我可以编写代码将其从raw_data 中提取出来,但肯定是我遗漏了什么,或者这是一个错误!?

【问题讨论】:

【参考方案1】:

我发现在 Chrome 浏览器raw_data['2011-01-01'] 所以它与时间格式不匹配!

你应该这样改变它:

format='%Y-%m-%d',

【讨论】:

以上是关于Wtforms.fields.html5 DateField 在 Flask 中不能作为普通的旧 DateField 工作的主要内容,如果未能解决你的问题,请参考以下文章

date时间

C++类和对象实战-Date类的实现

36.一文讲透JavaScript日期对象Date,时间戳1970date方法date计算

util.date和sql.date的衔接处理

Hive date/timestamp/date_sub/date_add/date_format/日期时间格式转换

Hive date/timestamp/date_sub/date_add/date_format/日期时间格式转换