2015-05-04 12 views
-3

У меня есть html-шаблон, содержащий некоторые коды Python и HTML-шаблоны. Ниже приведен пример.
Sqlite insert in Flask

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, они затем вводятся в SQLite, как

(2, и "{ 'ID': 1}", и "{ 'ID': 1}", 100,0)

Как я могу получить этот выход ?:

(2,1,1,100.0)

+0

Где вы хотите "этот выход" появится? Какой конкретный код вы пытаетесь улучшить? – amccormack

+0

@amccormack Я просто пытаюсь включить их в базу данных в этом формате. Я пытаюсь улучшить инструкцию g.db.execute. –

ответ

0

Проблемы был в 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.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 %} 
2

Вы должны преобразовать значения в правильный тип перед отправкой их в базу данных. request.form dict предоставляет метод 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 для анализа, преобразования и проверки данных для вас. Также рассмотрите возможность использования ORM, такого как Flask-SQLAlchemy, вместо написания необработанных операторов SQL.

+0

Спасибо за совет. Я планирую больше работать с ORM в будущем. Я не знаком с Flask-WTF, но я буду изучать его. –