如何使用具有两种不同形式的相同视图,并且不会丢失用户使用Flask提供的数据?

时间:2014-04-11 21:05:51

标签: python flask

我有一个关于会议的几个输入字段的表单。

@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,......

非常感谢您的帮助。

1 个答案:

答案 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();
});

也就是说,从编码和可用性角度来看,可能更好的选择是将主题数据异步加载到现有页面中,这样您就不必重新加载视图了。这样可以避免需要对表单数据进行临时保存。