我有一个关于会议的几个输入字段的表单。
@app.route('/Alt_Reuniao/<WCodigoChaveP>', methods=['GET', 'POST'])
def Alt_Reuniao(WCodigoChaveP):
# This function returns a list with de data from the Database about a specific meeting
WReuniao = Executa_Query_Leitura("0005", WCodigoChaveP, "O")
if not WReuniao:
flash('Error.......')
return redirect(url_for('Cad_Reunioes'))
else:
if WReuniao[8]:
# this function returns a list with de data from the Database about the topic of the meeting
WAssunto = Executa_Query_Leitura("0002", WReuniao[8], "O")
Wform = Cad_Reunioes_Form()
if request.method == "POST":
if Wform.validate():
# save the data ......
return redirect(url_for('Cad_Reunioes'))
else:
for Werro in Wform.errors.values():
flash(Werro[0])
return render_template('Reuniao.html', Wformulario=Wform)
else:
Wform.WCPO_Reuniao.data = WReuniao[1]
Wform.WCPO_Desc_Reuniao.data = WReuniao[2]
Wform.WCPO_Nro_Part.data = WReuniao[3]
Wform.WCPO_Cod_Assunto.data = WReuniao[8]
if WReuniao[8]:
if WAssunto:
Wform.WCPO_Assunto.data = WAssunto[1]
return render_template('Reuniao.html', Wformulario=Wform)
这是我的Reuniao.html模板:
{% extends "Base_Cad_2.html" %}
{% block dados %}
{{ Wformulario.WCPO_Reuniao.label(id="WCPO_Reuniao", class="lab1") }} {{ Wformulario.WCPO_Reuniao(size = 100, maxlength=30, id="WCPO_Reuniao") }}
<p id="PL"> {{ Wformulario.WCPO_L_Desc_Reuniao(id="WCPO_L_Desc_Reuniao", class="lab1") }} </p>
{{ Wformulario.WCPO_Desc_Reuniao(rows=5, cols=100, id="WCPO_Desc_Reuniao") }}
{{ Wformulario.WCPO_Nro_Part.label(id="WCPO_Nro_Part", class="lab1") }} {{ Wformulario.WCPO_Nro_Part(size = 5, id="WCPO_Nro_Part") }}
{{ Wformulario.WCPO_Cod_Assunto.label(id="WCPO_Cod_Assunto", class="lab1") }} {{ Wformulario.WCPO_Cod_Assunto(size=10, readonly='readonly', id="WCPO_Cod_Assunto") }}
{{ Wformulario.WCPO_Assunto.label(id="WCPO_Assunto", class="lab1") }} {{ Wformulario.WCPO_Assunto(size=95, readonly='readonly', id="WCPO_Assunto") }}
<button id="Selec_Assunto" name="Selec_Assunto" value="Selec_Assunto" type="button"> <a class="botoes" href="{{ url_for('Selec_Assuntos_Inicio', WRotChama = "001", WCodorig = Wformulario.WCPO_Cod_Reuniao ) }}" hreflang="pt-br"> Seleciona </a> </button>
{% endblock %}
{% block botoes %}
<button id="gravar" name="gravar" value="Gravar" type="submit" class="botoes" > Gravar </button>
{% endblock %}
基本上,这种观点很好。
当我从上一个模板中的列表中选择会议时,view方法是GET,数据库中的数据将传递给表单,模板呈现正确。
当方法是POST时,表单中的数据会正确保存在数据库中......
在表格上有一个按钮Selec_Assunto。当用户点击该按钮时,我指向一个视图,该模板呈现一个模板,其中包含会议所有可能主题的列表。这些主题来自数据库。可以有很多,所以我不能只使用一个组合。这就是我使用模板的原因。
当用户从列表中选择一个主题时,我必须再次渲染Alt_Reuniao视图,我必须将所选主题传递给视图。
这很好。
我的问题是:方法再次是GET。如果在点击Selec_Assunto按钮之前,用户在表单中的其他字段上更改或输入数据,则在选择主题时,我会从用户中丢失这些数据。该视图再次使用数据库中的数据呈现模板。
一切似乎都很好。我只想在点击Selec_Assunto按钮之前维护用户已在表单中更改的数据。
正如你所看到的,我是Web开发的新手,Python,Flask,......
非常感谢您的帮助。
答案 0 :(得分:0)
在这种情况下,您可以更新&#34; Selec_Assunto&#34;按钮行为将表单数据发布回服务器,但也包含重定向变量。当包含重定向变量时,服务器将保存表单更改,然后重定向到&#34; Selec_Assuntos_Inicio&#34;如果重定向变量不存在,它将遵循先前/正常的表单发布行为。例如:
if request.method == "POST":
if Wform.validate():
# save the data ……
if Wform.redirect.data:
return redirect(Wform.redirect.data)
else:
return redirect(url_for('Cad_Reunioes'))
else:
for Werro in Wform.errors.values():
flash(Werro[0])
return render_template('Reuniao.html', Wformulario=Wform)
值得注意的是,这种方法要求您使用JavaScript来覆盖&#34; Selec_Assunto&#34;按钮行为(因为你强迫它执行表单提交)。这是使用jQuery的一种方法:
$('button#Selec_Assunto').on('click', function() {
$('form#formId').append('<input type="hidden" name="redirect" value="{{ url_for('Selec_Assuntos_Inicio', WRotChama = "001", WCodorig = Wformulario.WCPO_Cod_Reuniao ) }}">');
$('form#formId').submit();
});
也就是说,从编码和可用性角度来看,可能更好的选择是将主题数据异步加载到现有页面中,这样您就不必重新加载视图了。这样可以避免需要对表单数据进行临时保存。