wtforms_sqlalchemy.orm.model_form 的日期对象

Date objects with wtforms_sqlalchemy.orm.model_form

我没有成功使用 model_form:

在我的模型中设置日期值
@app.route('/admin/article/<int:id>', methods=['PUT'])
@login_required
def admin_update(id):
    ArticleForm = model_form(Article, Form)

    article = Article.query.get_or_404(id)
    form    = ArticleForm(request.form, article)

    if form.validate():
        form.populate_obj(article)
        db.session.commit()
        return jsonify(status='success', article=article.as_dict()), 200

    # Invalid
    return jsonify(status='error', errors=form.errors), 400

我的模型是这样的:

class Article(db.Model):
    id    = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(255), index=True)
    lead  = db.Column(db.Text)
    body  = db.Column(db.Text)
    date  = db.Column(db.DateTime)

    def __init__(self, id=None, title=None, lead=None, body=None, date=None):
        self.id    = id
        self.title = title
        self.lead  = lead
        self.body  = body
        self.date  = date

    def as_dict(self):
       return {c.name: getattr(self, c.name) for c in self.__table__.columns}

我将文章导出为字典,所以我将其转换为JSON。我基于 JS 的所见即所得编辑器将所有数据 (title/lead/body/date) 转储到 XHR 请求中并将其发送到 API 点以上。

我从这个电话中得到的回应:

{
  "errors": {
    "date": [
      "Not a valid datetime value"
    ]
  }, 
  "status": "error"
}

我知道我尝试为 Sqlalchemy DateTime 设置字符串(当前格式 dd-mm-yyyy 28-03-2017),但我如何转换它?我可以根据需要调整格式,但我想坚持使用 model_form.

的简单视图

使用的工具:

  1. 烧瓶
  2. flask_wtf.Form
  3. wtforms_sqlalchemy.orm.model_form(无wtforms.ext.sqlalchemy.orm)

我认为问题不在于 Model 或 SqlAlchemy,而在于表单。

据我所知,您的日期列是日期时间(不是日期)。这是一个可以解释问题的Form的小例子:

# flask forms uses the same fields
from wtforms import Form, DateTimeField

class ArticleForm(Form):
    date = DateTimeField('Date')

form_data = MultiDict()
# your format of date dd-mm-yyyy - 28-03-2017
date = '28-03-2017'
form_data.add('date', date)
article = ArticleForm(form_data)
print article.validate() # False

为什么会这样?因为 DateTimeField 有不同的 default format - %Y-%m-%d %H:%M:%S.

如何解决?最简单的方法就是将格式设置为 date field 形式:

class ArticleForm(Form):
    date = DateTimeField('Date', format='%d-%m-%Y')

form_data = MultiDict()
form_data.add('date', '28-03-2017')
article = ArticleForm(form_data)
print article.validate() # True

另一种方法是手动转换日期:

form_data = MultiDict()
date = datetime.datetime.strptime('28-03-2017', '%d-%m-%Y')
form_data.add('date', '{:%Y-%m-%d %H:%M:%S}'.format(date))
article = ArticleForm(form_data)
print article.validate() # True

希望对您有所帮助。