定义与ListField一个mongoengine模型
我用的烧瓶mongoengine和我的模型Post
有场title
,slug
,body
和tags
不能为空。每个Post
有一个独特的slug
和每个Post
需要至少有1个标签。所以tags
是具有至少1个元素的strings
的list
。定义与ListField一个mongoengine模型
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
错误。 ,我通过在后请求的数据(提供者:萤火虫)
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
的任何价值。
怎么了?
你的代码对我的作品
WERKZEUG使用可以包含具有相同名称http://werkzeug.pocoo.org/docs/datastructures/
多个密钥的MultiDict当我尝试使用相同的名称3个输入字段,并在调试器中检查我的request.form得到:ImmutableMultiDict([('tag', u'1'), ('tag', u'2'), ('tag', u'3')])
,可与request.form.getlist('tag')
难道是获取值由于旧版本瓶/ WERKZEUG的?
我使用Flask 0.9和Werkezeug 0.8.3。你正在运行哪个版本? – lovesh
原谅我的无知,但我以前没有用过WTForms。是一个[FieldList](http://wtforms.simplecodes.com/docs/0.6/fields.html#wtforms.fields.FieldList)不同于'ListField'? –
@亚历克号他们是一样的。见[这里](https://flask-mongoengine.readthedocs.org/en/latest/)。在'Supported fields'部分 – lovesh