【问题标题】:Date objects with wtforms_sqlalchemy.orm.model_form带有 wtforms_sqlalchemy.orm.model_form 的日期对象
【发布时间】:2017-07-25 06:25:12
【问题描述】:

我没有成功使用 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}

我将文章导出为 dict,因此我将其转换为 JSON。我的基于 JS 的 WYSIWYG 编辑器在 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)

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy wtforms


    【解决方案1】:

    我认为问题不在于 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
    

    希望这会有所帮助。

    【讨论】:

    • 我在请求中使用了默认格式,一切正常。只是愚蠢,我没有质疑格式本身:D
    猜你喜欢
    • 1970-01-01
    • 2019-02-06
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2021-09-19
    相关资源
    最近更新 更多