在许多表格中,我们有一个取消按钮。试图让事情干涸似乎是一个帮助函数。函数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
edit.html
....
<input type="submit" name="submit" value="Submit" />
<input type="submit" name="cancel" value="Cancel" />
....
如果单击取消按钮,则结果:调用辅助函数,闪烁正确的消息,但不会发生重定向。是否可以从这样的辅助函数重定向?如果是这样的话?我们做错了什么?
答案 0 :(得分:4)
您未在if_form_cancel
函数中返回edit
的结果。但是你只想在用户取消时返回。一个例外在这里工作得很好,看起来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
而不是手动检查POST。
https://flask-wtf.readthedocs.org/en/latest/quickstart.html#validating-forms