Flask - 从模板中存储下拉值
我正在做一个Flask和Postgres的应用程序,遇到了一个问题,就是我做的下拉菜单无法把选中的值存储到数据库里。我不知道我缺少了什么。我在网上查了很多资料,但大部分相关的答案都是关于PHP的,而不是Flask。
这是我的Flask视图代码:
@app.route('/logworkout', methods=['POST'])
def post_log_workout():
try:
studio = (request.form.get['studio'])
instructor = (request.form.get['instructor'])
workout = Workout(studio=studio, instructor=instructor)
db.session.add(workout)
db.session.commit()
except:
return render_template("submit_workout.html", studio="", instructor="",
error="Error, your log is incomplete! Please check and submit it again!")
return render_template("submit_workout.html", studio=studio, instructor=instructor, error="")
这是HTML代码:
<form action="" method='post'>
<h3>2. Which Studio?</h3>
<select name='studio'>
<option value='Name1'>LongerName1</option>
<option value='Name2'>LongerName2</option>
<option value='Name3'>LongerName3</option>
</select>
<h3>2. Which Instructor?</h3>
<select name='instructor'>
<option value='Name1'>LongerName1</option>
<option value='Name2'>LongerName2</option>
<option value='Name3'>LongerName3</option>
</select>
<input type='submit' value='submit'>
</form>
1 个回答
4
你有几个地方需要改正。
首先,一个Flask的视图应该同时处理GET和POST请求。我建议你把视图代码调整成这样:
@app.route('/logworkout', methods=['GET','POST'])
def post_log_workout():
error=""
if request.method == 'POST':
studio = (request.form.get['studio'])
instructor = (request.form.get['instructor'])
if studio is not None and instructor is not None:
workout = Workout(studio=studio, instructor=instructor)
db.session.add(workout)
db.session.commit()
# you can redirect to home page on successful commit. or anywhere else
return redirect(url_for('index'))
else:
error="Error, your log is incomplete! Please check and submit it again!")
return render_template("submit_workout.html", error=error)
在你的代码中,只需要调用一次render_template。它的工作方式是,当你第一次访问网址/logworkout时,会发送一个GET请求,这时会显示表单。你填写完表单并提交后,它会重定向到主页或者其他地方。
在你的表单代码中,表单的action属性不应该留空。你需要使用url_for()方法来调用视图。
把这个
# Incorrect
<form action="" method='post'>
改成
# Correct
<form action="{{ url_for('post_log_workout') }}" method='post'>