2012-12-24 68 views
5

我用的燒瓶mongoengine和我的模型Post有場titleslugbodytags不能爲空。每個Post有一個獨特的slug和每個Post需要至少有1個標籤。所以tags是具有至少1個元素的stringslist定義與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場是一個空列表這是荒謬的,因爲它應該tagsrequest.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的任何價值。

怎麼了?

+0

原諒我的無知,但我以前沒有用過WTForms。是一個[FieldList](http://wtforms.simplecodes.com/docs/0.6/fields.html#wtforms.fields.FieldList)不同於'ListField'? –

+0

@亞歷克號他們是一樣的。見[這裏](https://flask-mongoengine.readthedocs.org/en/latest/)。在'Supported fields'部分 – lovesh

回答

0

你的代碼對我的作品

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的?

+0

我使用Flask 0.9和Werkezeug 0.8.3。你正在運行哪個版本? – lovesh

相關問題