Суть такая.
Страница с кнопкой:
<form action="{{ url_for('add_journal_record') }}" method="post">
<input type="hidden" name="docid" value="{{ doc['id'] }}">
<input type="hidden" name="docname" value="{{ doc['docname'] }}">
<input type="submit" value="Send">
</form>
Маршрут:
@app.route('/add_journal_record', methods=('GET', 'POST'))
def add_journal_record():
docid = request.form['docid']
docname = request.form['docname']
conn = get_db_connection()
people = conn.execute('SELECT p.id, p.personname FROM people AS p;').fetchall()
statuses = conn.execute('SELECT s.id, s.statusname FROM statuses AS s;').fetchall()
if request.method == 'POST':
journaldate = request.form['journaldate']
personid = request.form['person']
statusid = request.form['status']
comment = request.form['comment']
conn.execute('INSERT INTO journal (docid, personid, statusid, journaldate, comment) VALUES (?, ?, ?, ?, ?)',
(docid, journaldate, personid, statusid, comment))
conn.commit()
conn.close()
return redirect(url_for('index'))
return render_template('add_journal_record.html', people=people, statuses=statuses, docname=docname)
Из add_journal_record.html
:
<input type="date"
name="journaldate"
min="2018-01-01"
required
value={{ request.form['journaldate'] }}>
Если делать так, то ругается на werkzeug.exceptions.BadRequestKeyError / 400 Bad Request in Flask
, что ключи не найдены. Как я понял, дело в том, что из-за передачи из первого куска doc['id']
и doc['docname']
через post, маршрут сразу считает, что обрабатывает post, а значит все переменные, которые я присваиваю после if request.method == "POST":
не обнаруживаются (их еще не заполнили). Жанглирование с get не сработают, т.к. тогда doc['*']
не передастся.
Вопрос: как правильно передать по кнопке переменную, но чтобы это не считалось post? Правильно ли я вообще пытаюсь это сделать или есть пути правильнее/проще? Нуб во flask и python, да и в программировании в целом. Пилю для себя.