【发布时间】: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