Как мне заставить 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
Я пытаюсь создать файл «сохранения» того, что пользователь заполнил в формате .csv для загрузки. Я беру ввод формы и отправляю им файл .csv, чтобы они могли загрузить его позже и продолжить с того места, на котором остановились. После того, как я отправлю им файл .csv, я бы хотел направить их обратно туда, где они были, а не заставлять их заполнять его снова. Может быть, есть более простой способ сделать это? Я нуб.
Самый простой способ сделать загрузку так, как вы просите использовать 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
Я должен был быть более ясным. На самом деле у меня есть несколько кнопок отправки в форме, одна для сохранения и одна для выполнения вычислений, поэтому установка цели формы на «_blank» будет работать для одной кнопки, но не для другой. Однако полезная ссылка для преобразования в .csv.
Обновлено для поддержки нескольких кнопок форм, не делая их все target=_blank
в поведении @DCB2524.
Уточните: вы хотите вернуть их на страницу и заполнить форму тем, что они только что отправили? Почему?