Почему при отправке WTForm в Flask после установки значений скрытых полей в компоненте представления я получаю повторяющиеся переменные в результате публикации? - PullRequest
0 голосов
/ 27 марта 2020

Когда я устанавливаю значение скрытых полей в компоненте представления и отправляю форму, переменная POST на другом конце возвращает два экземпляра каждой переменной, где первый является пустым, а второй содержит ожидаемые данные. Кажется, я не могу получить или извлечь данные из переменной POST (тип ImmutableMultiDict). Если я приведу POST к диктату, я потеряю вторые переменные, включая данные. Также, если я пытаюсь перебрать переменную POST и создать словарь, вторая переменная не копируется. Поэтому я не могу получить данные POST, даже если приму эту двуличность.

Я использую Flask и WTForms в традиционной MVC архитектуре.

forms.py:

class TestForm(FlaskForm):
   the_int = HiddenField()
   the_string = HiddenField()
   the_list = HiddenField()
   the_dict = HiddenField()
   submit = SubmitField('Submit')

rout.py:

@app.route('/test')
def test():
    an_int = 1
    a_string = "ABC"
    a_list = ['One', 'Two']
    a_dict = {'First': 'A', 'Second': 'B'}
    form = TestForm()
    return render_template('test.html', an_int = an_int,
                                        a_string = a_string,
                                        a_list = a_list,
                                        a_dict = a_dict,
                                        form = form)


@app.route('/testresult', methods=['GET', 'POST'])
def testresult():
    if request.method == "POST":
        formdata = request.form
        dictdata = dict(request.form)
        builtdata = {}
        for k, v in request.form.items():
            builtdata.update({k: v})
        return render_template('testresult.html', formdata = formdata,
                                                  dictdata = dictdata,
                                                  builtdata = builtdata)
    return render_template('test')

test. html:

<h1>Test</h1>
<br>
<form action="testresult" method="POST">
    {{ form.hidden_tag() }}
    {{ form.the_int(value=an_int) }}
    {{ form.the_string(value=a_string) }}
    {{ form.the_list(value=a_list) }}
    {{ form.the_dict(value=a_dict) }}
    {{ form.submit() }}
</form>

результат теста. html:

<h1>Result</h1>
<p>{{ formdata }}</p>
<p>{{ dictdata }}</p>
<p>{{ builtdata }}</p>

Результат в результате теста. html:

Result

ImmutableMultiDict([('the_int', ''), ('the_int', '1'), ('the_string', ''), ('the_string', 'ABC'), ('the_list', ''), ('the_list', "['One', 'Two']"), ('the_dict', ''), ('the_dict', "{'First': 'A', 'Second': 'B'}"), ('csrf_token', 'IjN---kWw'), ('submit', 'Submit')])

{'the_int': '', 'the_string': '', 'the_list': '', 'the_dict': '', 'csrf_token': 'IjN---kWw', 'submit': 'Submit'}

{'the_int': '', 'the_string': '', 'the_list': '', 'the_dict': '', 'csrf_token': 'IjN---kWw', 'submit': 'Submit'}

1 Ответ

0 голосов
/ 28 марта 2020

form.hidden_tag() отображает все скрытые поля в вашей форме. Вы также визуализируете свои скрытые поля вручную, чтобы они в итоге были определены дважды.

Вот документация для hidden_tag .

Правильный способ кодирования вашего шаблона будет быть:

<h1>Test</h1>
<br>
<form action="testresult" method="POST">
    {{ form.hidden_tag() }}
    {{ form.submit() }}
</form>

Чтобы вставить значения в скрытые поля, сделайте это в функции просмотра:

    form = TestForm()
    form.the_int.data = an_int
    form.the_string.data = a_string
    form.the_list.data = a_list
    form.the_dict.data = a_dict
    return render_template('test.html', form = form)
...