我有以下代码从WTForm获取变量,用户可以在其中输入名称或ID,这将用于我的数据库中的查询。问题是当提交一个字段时URL会“中断”,例如,如果没有提交piname,则url看起来像'/ find_pi // 1424524'。有没有办法解决这个问题而不必分解代码?我的下一个任务涉及多个“可选”字段,这些字段将更难分解。
@main.route('/find_pi/', methods=('GET', 'POST'))
def pick_pi():
form = PeopleFinder()
if form.validate_on_submit():
piname = form.piname.data
piid = form.piid.data
return redirect(url_for('.piresults', piname=piname, piid=piid)
return render_template('specify_pi.html', form=form)
@main.route('/find_pi/<piname>/<piid>')
def find_pi(piname, piid):
if piname != None:
entries = Grant.query.filter(Grant.pi_name==(piname)).all()
return render_template('piresults.html', entries=entries)
if piid != None:
entries = Grant.query.filter(Grant.pi_id==(piid)).all()
return render_template('piresults.html', entries=entries)
谢谢!
答案 0 :(得分:0)
如果您需要piname
或piid
,有几种方法可以实现此目的:
1.单独路线
@main.route('find_pi/<str:piname>')
def find_pi_by_name(piname):
entries = Grant.query.filter(Grant.pi_name==(piname)).all()
return render_template('piresults.html', entries=entries)
@main.route('find_pi/<int:piid>') # int ensures that piid is a number
def find_pi_by_id(piid):
entries = Grant.query.filter(Grant.pi_id==(piid)).all()
return render_template('piresults.html', entries=entries)
2.检查piname和piid
的单一路线@main.route('/find_pi/<piname_or_piid>')
def find_pi(piname_or_piid):
piid = None
piname = None
try:
piid = int(piname_or_piid)
except ValueError:
piname = piname_or_piid
if piname != None:
entries = Grant.query.filter(Grant.pi_name==(piname)).all()
elif piid != None:
entries = Grant.query.filter(Grant.pi_id==(piid)).all()
return render_template('piresults.html', entries=entries)
如果您计划添加其他可选参数,那么您应该使用查询字符串,基本网址不是放置可选元素的好地方。