在许多表单上,我们都有一个取消按钮。试图保持干燥,似乎有一个辅助功能是有序的。函数 if_form_cancel() 将检查是否已单击取消按钮,然后相应地重定向(将目标传递给函数)。但是,当我们使用辅助函数时,重定向会被忽略(它内联工作得很好)。
view.py
from helper.py import if_form_cancel
...
def index():
return render_template('index.html')
def edit():
...
form = EditForm(obj=user, csrf_enabled=False)
if request.method == 'POST':
if_form_cancel(url_for('.index'))
if form.validate():
...
return redirect(url_for('.index'))
return render_template('edit.html')
helper.py
from flask import request, redirect, flash
def if_form_cancel(destination='/'):
try:
if request.form['cancel']:
flash(u'Operation canceled at user request')
return redirect(destination)
except KeyError:
pass
编辑.html
....
<input type="submit" name="submit" value="Submit" />
<input type="submit" name="cancel" value="Cancel" />
....
单击取消按钮时的结果:调用帮助程序函数,刷新正确消息,但不发生重定向。是否可以从这样的帮助程序函数重定向?如果是这样,怎么办?我们做错了什么?
您不会返回edit
函数中if_form_cancel
的结果。但是,您只想在用户取消时返回。一个例外在这里效果很好,看起来 werkzeug 有这样的例外。
看看这是否有效(未经测试)。
from werkzeug.routing import RequestRedirect
def if_form_cancel(destination='/'):
try:
if request.form['cancel']:
flash(u'Operation canceled at user request')
raise RequestRedirect(destination)
except KeyError:
pass
或者,您可以让form_cancel
帮助程序检查表单,并在用户取消时返回 True,并在视图本身中执行重定向。
def edit():
...
form = EditForm(obj=user, csrf_enabled=False)
if request.method == 'POST':
if form_cancel():
return redirect(url_for('.index'))
if form.validate():
...
return redirect(url_for('.index'))
return render_template('edit.html')
此外,请考虑使用 validate_on_submit
,而不是手动检查开机自检。
https://flask-wtf.readthedocs.org/en/latest/quickstart.html#validating-forms