【问题标题】:How to repopulate WTForms如何重新填充 WTForms
【发布时间】:2013-07-02 21:29:45
【问题描述】:

所以我在 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')])

【问题讨论】:

    标签: python mongodb flask mongoengine wtforms


    【解决方案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.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。

    【讨论】:

      【解决方案2】:

      您可以使用列表推导过滤掉 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')]
      >>> 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 2013-11-03
        • 2012-08-07
        • 2013-11-14
        相关资源
        最近更新 更多