【问题标题】:Passing a checkbox value from a Flask-WTForms form in a redirect back to the same form在重定向中将 Flask-WTForms 表单中的复选框值传递回同一表单
【发布时间】:2018-02-08 00:20:08
【问题描述】:

使用 Flask 和 Flask-WTF,我想重定向到带有复选框的表单的页面。 我有一个初始搜索页面,其中包含一个名为“SearchForm”的表单,在用户搜索后,我将他重定向到具有相同 SearchForm 的结果页面,然后是结果列表视图。这使用户可以在结果页面上再次搜索。

这是我的表格:

class SearchForm(Form):
    """Search form class"""
    from app.utils.translation import Translation

    criteria = StringField(Translation.label('search'), validators=[DataRequired()])
    all_employees = BooleanField(Translation.label('all_employees'), validators=[])

现在当用户提交表单时,我可以像这样实例化它:

form = SearchForm(request.form)

我可以使用(例如)获取数据:

form.data['all_employees']

如果我不选中该复选框,WTForms 会正确地将 all_employees 解析为 False。 我重定向到具有相同表单的结果页面,并且我想使用用户刚刚提交的数据呈现该表单。所以我这样做:

return redirect(url_for('employees.search',
                        criteria=form.data["criteria"],
                        all_employees=form.data["all_employees"]
                        ))

在搜索表单上,我使用查询字符串 (URL) 变量再次实例化表单:

form = SearchForm(request.args)

现在的问题是,因为 form.data['all_employees'] 有一个值“False”,复选框被选中。这当然是 HTML 的正常行为,仅当复选框被选中时才会传递复选框值。因此,如果有一个值(并且“False”一个值),复选框就会被选中。

我可以在我的重定向中使用类似的东西来解决这个问题:

all_employees='y' if form.data['all_employees'] else ''

但这意味着我必须不断为每个重定向中的每个复选框字段执行此操作。我有很多类似的屏幕想以这种方式实现。

我可以想象 WTforms 也可以以某种方式解析复选框的“虚假”值,而不是在这些情况下选中该框,但如果这可能的话,我找不到任何文档。

我还考虑在结果页面上处理它,如果值是“假”,则从 request.args 集合中删除一个变量,但这也感觉很笨拙。

也许还有另一种我不知道的方法,或者我的解决方法只是使用复选框处理重定向的方法,我不知道,但在我看来这是一个Flask-WTForms 可能有某种解决方案的非常常见的用例。

任何建议将不胜感激。

编辑

问题更大;我刚刚注意到使用以下代码将空字符串传递给我的重定向:

all_employees='y' if form.data['all_employees'] else ''

随后使用以下方法实例化和呈现表单:

form = SearchForm(request.args)

将空复选框呈现为:

<input id="include_inactive" name="include_inactive" type="checkbox" value="">

因此,之后再次勾选,会传回一个空字符串给Flask,所以当一个checkbox被取消勾选一次后,会渲染一个空值,再也无法勾选。

【问题讨论】:

    标签: flask wtforms flask-wtforms


    【解决方案1】:

    在最基本的情况下,从 HTML 复选框的角度来看,urlencoded 字符串 otherdata=value&amp;all_employees=False 是一个真值。

    WTForms 大部分遵循 HTML 表单和表单数据的规则。但是,由于这个布尔值是一个常见的问题,您可以使用 false_values 关键字参数自定义它来定义“假”值...您可以让 false_values 包含字符串 @ 987654324@.

    为了更“对 HTML 规范友好”,另一种方法是像这样的帮助器:

    def url_for_form(urlname, form, **kwargs):
        for field in form:
            if field.data:  # would exclude blank strings too
                kwargs[field.name] = field.data
    
        return url_for(urlname, **kwargs)
    

    用法类似于url_for_form('blah.search', form, otherparam=9)

    如果您需要选择特定的字段,那么您可以稍微不同地进行设计。

    【讨论】:

    • 我实际上已经尝试过“false_values”参数,但是由于某种原因,WTForms 将我的复选框呈现为默认值“False”而不是“y”。这把事情搞砸了,因为这样一个复选框会传递“False”,所以我放弃了这种方法。但是,您的助手是解决此问题的好方法。我想我可以解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 2013-04-23
    相关资源
    最近更新 更多