2013-07-02 100 views
0

所以我已经在WTForms中制作了一个窗体,其中有一个编辑按钮,允许用户编辑窗体中的以前的数据。如何重新填充WTForms

我已经从form.when我做的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')]) 

回答

0

您可以使用列表理解来过滤出csrf_tokens。

>>> 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')] 
>>> 
1

你已经做了写出在WTForms窗体类的工作(我怀疑瓶,跆拳道,考虑到crsf_token不会有正常,除非你故意使用CSRF)。

这样就意味着你已经做的东西类似于:

class MyForm(Form): 
    feed_url = TextField(...) 
    # etc 

,然后你已经不喜欢的东西

def my_view(): 
    form = MyForm(request.form) 
    render('mytemplate.html', form=form) 

现在,你有这真棒表单对象,用它!也就是说,访问包含数据类型强制数据的数据form.dataform.feed_url.data。此外,您可以在wtforms中使用验证逻辑,以确保您没有任何不良数据。没有理由使用request.form这是来自您的框架的原始输入。

这会降落在你喜欢的东西(注意,这是一个假想的伪框架的通用例子,你将需要获得适当的呼叫名字你的框架):

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) 

我建议你阅读WTForms的Crash Course以及其他一些文档,以便更好地了解如何使用WTForms。