Python 如何重新填充WTForms

Python 如何重新填充WTForms,python,mongodb,flask,mongoengine,wtforms,Python,Mongodb,Flask,Mongoengine,Wtforms,因此,我在WTForms中创建了一个表单,其中有一个编辑按钮,允许用户编辑表单中以前的数据 我遇到的问题是从表单中获取新数据。当我执行request.form时,我得到以下信息: ImmutableMultiDict([('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52

因此,我在WTForms中创建了一个表单,其中有一个编辑按钮,允许用户编辑表单中以前的数据

我遇到的问题是从表单中获取新数据。当我执行request.form时,我得到以下信息:

ImmutableMultiDict([('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('location_name', u'b'), ('feed_url', u'bkj'), ('title', u'b'), ('url', u'b'), ('date_crawled', u'b'), ('content_url', u'b'), ('longitude', u'b'), ('latitude', u'b'), ('date_added', u'b'), ('types', u'b')])
我想要的是从上面的输出中检索以下内容

('location_name', u'b'), ('feed_url', u'bkj'), ('title', u'b'), ('url', u'b'), ('date_crawled', u'b'), ('content_url', u'b'), ('longitude', u'b'), ('latitude', u'b'), ('date_added', u'b'), ('types', u'b')])

您可以使用列表理解来过滤掉csrf_标记

>>> import werkzeug
>>> i = werkzeug.ImmutableMultiDict([('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('location_name', u'b'), ('feed_url', u'bkj'), ('title', u'b'), ('url', u'b'), ('date_crawled', u'b'), ('content_url', u'b'), ('longitude', u'b'), ('latitude', u'b'), ('date_added', u'b'), ('types', u'b')])
>>> i
ImmutableMultiDict([('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('location_name', u'b'), ('feed_url', u'bkj'), ('title', u'b'), ('url', u'b'), ('date_crawled', u'b'), ('content_url', u'b'), ('longitude', u'b'), ('latitude', u'b'), ('date_added', u'b'), ('types', u'b')])
>>> keys = ['location_name', 'feed_url', 'title', 'url', 'date_crawled', 'content_url', 'longitude', 'latitude', 'date_added', 'types']
>>> data = [(key, i[key]) for key in i if key in keys]
>>> data
[('location_name', u'b'), ('feed_url', u'bkj'), ('title', u'b'), ('url', u'b'), ('date_crawled', u'b'), ('content_url', u'b'), ('longitude', u'b'), ('latitude', u'b'), ('date_added', u'b'), ('types', u'b')]
>>> 

您已经完成了在WTForms中编写表单类的工作(我怀疑Flask WTF,因为crsf_令牌通常不会出现,除非您有意使用CSRF)

这意味着你已经做了类似于:

class MyForm(Form):
    feed_url = TextField(...)
    # etc
然后你已经做了类似的事情

def my_view():
    form = MyForm(request.form)
    render('mytemplate.html', form=form)
现在你有了这个很棒的表单对象,使用它吧!也就是说,从包含数据类型强制数据的
form.data
form.feed\u url.data
中访问数据。此外,您可以在wtforms中使用验证逻辑来确保没有任何错误数据。没有理由使用
request.form
,它是来自框架的原始输入

这将为您带来以下内容(注意,这是一个虚构的伪框架的通用示例,您需要为您的框架获得适当的调用名):

为了更好地了解如何使用WTForms,我建议您阅读for WTForms以及其中的一些其他文档

def edit_location(location_id):
    my_object = LocationInfo.get(location_id)
    form = MyForm(request.form, obj=my_object)
    if request.form and form.validate():
        # If we got here, we have POST data and the form validated.
        form.populate_obj(my_object) # Super cool magic!
        my_object.save()
        return redirect(...)

    # If we fall back to here, it means validation failed or we're
    # viewing the form for the first time.
    render('mytemplate.html', form=form)