我正在使用flask-mongoengine,我的模型Post
包含字段title
,slug
,body
和tags
。每个Post
都有一个唯一的slug
,每个Post
都需要至少有一个标记。因此,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
的新文本框中,因此,如果我有Post
的3个标记,那么就会有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
错误。
我在帖子请求中传递的数据(Courtesy: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
tags
字段是一个空列表,这是荒谬的,因为它应该填充request.form
来自print request.form
。另外,如果我在调试器中输入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
没有获得{{1}}的任何价值。
怎么了?
答案 0 :(得分:0)
您的代码适合我
Werkzeug使用的MultiDict可以包含多个具有相同名称的密钥http://werkzeug.pocoo.org/docs/datastructures/
当我尝试3个具有相同名称的输入字段并在调试器中检查request.form时,我得到:ImmutableMultiDict([('tag', u'1'), ('tag', u'2'), ('tag', u'3')])
并且可以使用request.form.getlist('tag')
可能是因为旧版本的flask / werkzeug?