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
.
的简单视图
使用的工具:
- 烧瓶
- flask_wtf.Form
- 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
希望对您有所帮助。
我没有成功使用 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
.
使用的工具:
- 烧瓶
- flask_wtf.Form
- 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
希望对您有所帮助。