Flask - вернуть ту же форму, которая была отправлена - PullRequest
0 голосов
/ 28 мая 2019

Как мне заставить Flask вернуть пользователя на ту же страницу, заполненную таким же образом, после того, как он / она отправит форму на страницу? 'render_template', кажется, работает, только если я знаю все переменные заранее. Моя форма динамическая, и переменные меняются в зависимости от выбора, сделанного пользователем. Посмотрите псевдо-код ниже, о чем я думаю. Я знаю, что render_template не работает так, но есть ли способ просто сказать «использовать те же значения формы, которые были введены при рендеринге шаблона?»

@app.route('./MyPage', methods=['GET', 'POST'])
def MyPage():

  if request.method == 'POST':
    # Do some stuff
    # return render_template('MyPage.html', context=request.form)
  else:
    # Do some other stuff

1 Ответ

1 голос
/ 28 мая 2019

Самый простой способ сделать загрузку так, как вы просите, чтобы использовать target="_blank" в вашей форме:

<form action="/MyPage" method="POST" target="_blank">
  <ul>
  {% for input in form %}
    <li>{{ input.label }} {{ input }}</li>
  {% endfor %}
  </ul>
</form>

Тогда ваш POST метод обработки не должен ничего делать, кроме как вернуть CSV:

@app.route('/MyPage', methods=['GET', 'POST'])
def MyPage():
  if request.method == 'POST':
    # Turn `request.form` into a CSV
    # see https://stackoverflow.com/q/26997679/135978 for an example
    headers = {'Content-Disposition': 'attachment; filename=saved-form.csv', 'Content-Type': 'text/csv'}
    return form_as_csv, headers
  else:
    # Do some other stuff

Если вам нужно несколько кнопок в форме, тогда вместо установки target в форме вы можете просто установить formtarget="_blank" на кнопку, которая вызывает CSV:

<form action="/MyPage" method="POST">
  <ul><!-- ... snip ... --></ul>
  <button name="submit_action" value="SAVE_AS_CSV" formtarget="_blank">Save as CSV</button>
  <button name="submit_action" value="RUN_CALCULATION">Run Calculation</button>
</form>

Тогда вам просто нужно добавить чек на request.form['submit_action'] в свой блок if request.method == 'POST', и вы отправитесь в гонки:

if request.method == 'POST':
    if request.form['submit_action'] == 'SAVE_AS_CSV':
        # Return the CSV response
    else:
        # Return the calculation response

См. Также: Запись CSV из среды Flask

...