5

私はフラスコ モンゴエンジンを使用しており、私のモデルPostにはフィールドtitleslugbodyおよびがありtagsます。それぞれPostに固有のタグがslugあり、それぞれPostに少なくとも 1 つのタグが必要です。少なくとも1 つの要素を持つtagsoflistも同様です。strings

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ため、a に 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、ブラウザにエラーが表示されます。投稿リクエストで渡すデータ (提供: 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、フォームには複数ありますが、辞書には1つしかありません。これは辞書であるため、同じ名前のキーが複数存在することはありません。しかし、私が調べる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'  }

フィールドはfromtagsで入力する必要があるため、不合理な空のリストです。また、デバッガーに入ると、tagsrequest.formprint 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オブジェクトは同じ名前の複数の値を保持してrepresentation( __repr__)で表示するが、オブジェクトに渡す値は1つだけであることを意味しModelFormます。しかし、私のModelFormは の値を取得していませんtags

どうしたの?

4

1 に答える 1

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が原因でしょうか?

于 2013-01-10T21:29:21.757 に答える