Flask 中的 SQLite 插入

Sqlite insert in Flask

我有一个 html 模板,其中包含一些 Python 代码和 HTML 模板。这是下面的示例。

Python:

cur1 = g.db.execute('select ID from Students')
students = [dict(ID=row[0]) for row in cur1.fetchall()]
cur2 = g.db.execute('select ID from Quizzes')
quizzes = [dict(ID=row[0]) for row in cur2.fetchall()]
if request.method == 'POST':
    if not session.get('logged_in'):
        abort(401)
    g.db.execute('insert into Results (quiz,student,grade) values '\
                 '(?,?,?)',[request.form['Quiz'],
                            request.form['Student'],
                            request.form['grade']])
    g.db.commit()
    return render_template('add_result.html',students=students,quizzes=quizzes)

HTML:

  <form action="{{ url_for('add_result') }}" method=post>
  <select name="Quiz">
    {% for quiz in quizzes %}
    <option value="{{ quiz }}">{{ quiz.ID }}</option>
    {% endfor %}
  </select>
  <select name="Student">
    {% for student in students %}
    <option value="{{ student }}">{{ student.ID }}</option>
    {% endfor %}
  </select>
  <input type="number" name="grade">
  <input type="submit" value=Submit>
  </form>

以我想要的格式(整数)输出下拉列表,但是,例如,假设值测验 #1 和学生 #1 的成绩为 100,然后将它们作为

(2, u"{'ID': 1}", u"{'ID': 1}", 100.0)

我怎样才能得到这个输出?:

(2,1,1,100.0)

在将值发送到数据库之前,您需要将它们转换为正确的类型。 request.form 字典提供了一个 get 方法,可以转换值或引发错误。

g.db.execute(
    'insert into Results (quiz,student,grade) values (?,?,?)',
    (
        request.form.get('Quiz', type=int),
        request.form.get('Student', type=int),
        request.form.get('grade', type=float)
    )
)

在较长的 运行 中,使用诸如 Flask-WTF to parse, convert, and validate the data for you. Also consider using an ORM such as Flask-SQLAlchemy 之类的表单库比编写原始 SQL 语句要容易得多(也更安全)。

问题出在 HTML:

<select name="Quiz">
    {% for quiz in quizzes %}
    <option value="{{ quiz }}">{{ quiz.ID }}</option>
    {% endfor %}
  </select>
  <select name="Student">
    {% for student in students %}
    <option value="{{ student }}">{{ student.ID }}</option>
    {% endfor %}

我将 "quiz" 和 "student" 作为 s,quiz.ID 和 student.ID 在值中显示为文本。这是表单返回的选项值。

应该是:

  <select name="Quiz">
    {% for quiz in quizzes %}
    <option value="{{ quiz.ID }}">{{ quiz.ID }}</option>
    {% endfor %}
  </select>
  <select name="Student">
    {% for student in students %}
    <option value="{{ student.ID }}">{{ student.ID }}</option>
    {% endfor %}