使用wtforms_sqlalchemy.orm.model_form

时间:2017-03-05 11:21:11

标签: python flask sqlalchemy flask-sqlalchemy wtforms

我没有成功使用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请求中转储所有数据(title / lead / body / date)并将其发送到API点以上。

我从此电话中得到的回复:

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

我知道我尝试为Sqlalchemy 28-03-2017设置一个字符串(当前格式为dd-mm-yyyy DateTime),但我该如何转换呢?我可以将格式调整为所需的任何内容,但我想坚持model_form的简单视图。

使用的工具:

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

1 个答案:

答案 0 :(得分:0)

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

我可以看到你的日期列是DateTime(不是Date)。这是Form的一个小例子,它可以解释这个问题:

%Y-%m-%d %H:%M:%S

为什么会这样?因为DateTimeField具有不同的default format - 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

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

n

希望这有帮助。