Может вставлять только строковые значения в поле Flask WTF-Forms. - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь, чтобы функция представления вставляла десятичные значения (в конечном итоге из базы данных) в поле формы WTF. Значение не отображается, пока я не изменю поле на строковое поле. Нужно ли что-то дополнительное, чтобы вставить числовое значение в десятичное поле?

Я создал небольшой, надеюсь, воспроизводимый пример, чтобы проверить только эту функциональность. У него есть одно поле, которое при загрузке страницы должно вставить значение в поле.

Первоначально я попытался сделать это с десятичным полем и попытался вставить случайное число, но это число не отображаетсякогда страница отображается. То же самое происходит, когда поле изменяется на IntegerField или FloatField

. При изменении поля формы на строковое поле значение будет отображаться при отображении страницы - однако это не идеальное решение, поскольку значение будетстрока.

rout.py

from flask import render_template, flash
from app import app
from app.forms import TestForm

@app.route('/',methods=['GET','POST'])
@app.route('/index/',methods=['GET','POST'])
def index():
    # define form
    test_form = TestForm()

    test_form.testfield.data = 10

    return render_template('sandbox_home.html',
        test_form = test_form
        )

forms.py

from flask_wtf import FlaskForm
from wtforms import StringField,DecimalField

class TestForm(FlaskForm):
    testfield=StringField()

sandbox_home. html

<!doctype html>

<title>My Safe Place</title>

<p>I exist to paste values to form fields!</p>

<form action="" method="post" novalidate>  
  {{ test_form.hidden_tag() }}
  {{ test_form.testfield() }}
</form>

Я ожидаю, что значение будет отображаться независимо от типа поля, если вход имеет правильный тип. Я предполагаю, что это проблема с типом данных, но я не уверен, где проблема.

1 Ответ

0 голосов
/ 09 ноября 2019

Вот минимальный пример, который показывает, что это работает нормально:

from flask import Flask, render_template_string
from flask_wtf import FlaskForm
from wtforms import StringField, IntegerField, DecimalField


app = Flask(__name__)
app.secret_key = ";lskjflksdjflsdkjfsd;lghdi9uawhj"


class TestForm(FlaskForm):
    test_str = StringField()
    test_int = IntegerField()
    test_dec = DecimalField()


template = """
<!doctype html>

<title>My Safe Place</title>

<p>I exist to paste values to form fields!</p>

<form action="" method="post" novalidate>
  {{ test_form.hidden_tag() }}
  {{ test_form.test_str() }}
  {{ test_form.test_int() }}
  {{ test_form.test_dec() }}
</form>
"""


if __name__ == "__main__":
    # simulate handling a request
    with app.test_request_context():
        test_form = TestForm()
        test_form.test_str.data = 10
        test_form.test_int.data = 10
        test_form.test_dec.data = 10

        # render the template and save to file so can open in browser
        with open("test.html", "w") as f:
            f.write(render_template_string(template, test_form=test_form))

Сохраняет обработанный шаблон в файл с именем test.html, который выглядит следующим образом:

<!doctype html>

<title>My Safe Place</title>

<p>I exist to paste values to form fields!</p>

<form action="" method="post" novalidate>
  <input id="csrf_token" name="csrf_token" type="hidden" value="IjUyMDI2NDYxMDY2OTc3N2E0OTU3ODYwM2M0Y2RiMzNjYjY5OWZlMDAi.XcXs_g.55IiutLhjhC2h7J9MI8rWtNu9co">
  <input id="test_str" name="test_str" type="text" value="10">
  <input id="test_int" name="test_int" type="text" value="10">
  <input id="test_dec" name="test_dec" type="text" value="10.00">
</form>

И здесьэто скриншот этого в браузере:

enter image description here

Как видно из визуализированного шаблона, WTForms не различает различные типы полей вбраузер (то есть все они type="text"). Если вы можете дать мне знать, как изменить этот скрипт, чтобы воспроизвести вашу ошибку, я с удовольствием посмотрю на нее снова.

...