所以我在WTForms中创建了一个带有编辑按钮的表单,允许用户编辑表单中的先前数据。
我遇到的问题是从表单中获取新数据。当我请求时。我得到以下内容:
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 :(得分:1)
你已经完成了在WTForms中编写表单类的工作(我怀疑Flask-WTF,因为除非你故意使用CSRF,否则crsf_token不会正常存在)。
这意味着你已经做了类似的事情:
class MyForm(Form):
feed_url = TextField(...)
# etc
然后你已经做了像
这样的事情def my_view():
form = MyForm(request.form)
render('mytemplate.html', form=form)
现在您拥有了这个非常棒的表单对象,请使用它!也就是说,访问包含数据类型强制数据的form.data
或form.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)
我建议您阅读WT {Crash Course以及其他一些文档,以便更好地了解如何使用WTForms。
答案 1 :(得分: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')]
>>>