Flask - 从模板中存储下拉值

3 投票
1 回答
7395 浏览
提问于 2025-04-18 07:33

我正在做一个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'>

撰写回答