【发布时间】:2012-12-10 18:14:01
【问题描述】:
我正在使用flask-mongoengine,我的模型Post 具有字段title、slug、body 和tags。每个Post 有一个唯一的slug,每个Post 至少需要有1 个标签。所以tags 是list 的strings 至少有1 个元素。
class Post(db.Document):
created_at = db.DateTimeField(default=datetime.datetime.now, required=True)
title = db.StringField(max_length=255, required=True)
slug = db.StringField(max_length=255, required=True, unique=True)
body = db.StringField(required=True)
tags = db.ListField(db.StringField(max_length=255), required=True) #each post should have at least one tag
def get_absolute_url(self):
return url_for('post', kwargs={"slug": self.slug})
def __unicode__(self):
return self.title
meta = {
'allow_inheritance': False,
'indexes': ['-created_at', 'slug', 'title', 'tags'],
'ordering': ['-created_at'],
'collection': 'posts',
}
当我在模板中创建用于输入新帖子的表单时,每个标签都会输入到名称为 tags 的新文本框中,因此如果我有 3 个标签用于 Post,那么将有 3 个文本框每个都有名字tags
这是视图的方式
from flask.ext.mongoengine.wtf import model_form
class CreateEdit(MethodView):
form = model_form(Post) #Gets object of class PostForm which is a subclass of ModelForm, ModelForm is a subclass of Form
def post(self, slug = None):
form = self.form(request.form) #Populate PostForm with data from the request
post = Post()
form.populate_obj(post)
post.save()
flash('Update successful')
现在我在浏览器中收到mongoengine.base.ValidationError 错误。
我在 post 请求中传递的数据(礼貌:Firebug)
title: third post
slug: 3rd
body: this is the 3rd post
tags: third
tags: last
当我在调试器中检查时request.form 显示
werkzeug.datastructures.ImmutableMultiDict({'body': u'this is the 3rd post \r\n ', 'title': u'third post', 'slug': u'3rd', 'tags': u'third'})
现在表单中有多个tags,但字典中只有一个。这没关系,因为它是一个字典,所以不能有多个具有相同名称的键。但是当我检查form.data 时,它会显示
{'body': u'this is the 3rd post \r\n ', 'title': u'third post', 'created_at': datetime.datetime(2012, 12, 24, 14, 7, 18, 97273), 'tags': [], 'slug': u'3rd' }
tags 字段是一个空列表,这很荒谬,因为它应该填充来自request.form 的tags。另外,如果我在调试器中输入print request.form,我会得到 p>
ImmutableMultiDict([('body', u'this is the 3rd post \r\n '), ('title', u'third post'), ('slug', u'3rd'), ('tags', u'third'), ('tags', u'last')])
所以这意味着request 对象保留了同名的多个值以在表示中显示它(__repr__),但只将一个值传递给ModelForm 对象。但是我的ModelForm 没有为tags 带来任何价值。
怎么了?
【问题讨论】:
标签: python flask mongoengine wtforms