Flask WTForms dynamici c выбрать поле из списка вместо базы данных - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь создать динамический выпадающий список c (SelectField) с WTForms. Я прочитал документацию и посмотрел довольно много ответов в стеке, и все примеры включают итерации по запросу базы данных.

Я просто хочу перебрать список (который генерируется из внешнего вызова API), чтобы внедрить варианты выбора SelectField. Например:

class ToolForm(FlaskForm):


    myField3 = SelectField(u'Select Account', choices=[], coerce=int)


@app.route("/test", methods=['GET', 'POST'])
def test():
    form = ToolForm()
    accounts5 = []

    if request.method == 'POST':
        if request.form['submit_button'] == 'Select Account':

            #code that generates list called "accounts5"

            acctchoices = [(c.id,c.name) for c in accounts5]
            form.myField3.choices = acctchoices

    return render_template('test.html', title='test', form=form, accounts5=accounts5)

И мой соответствующий HTML выглядит так:

<div class="form-group">
    {{ form.myField3.label(class="form-control-label") }} {% if form.myField3.errors %} {{ 
    form.myField3(class="form-control form-control-lg is-invalid") }}
    <div class="invalid-feedback">
        {% for errors in form.myField3.errors %}
        <span>{{ error }}</span>
        {% endfor %}
    </div>
    {% else %} {{ form.myField3(class="form-control form-control-lg") }} {% endif %}
</div>
<form action="http://127.0.0.1:5000/test" method="post">


    <input type="submit" class="btn btn-outline-info" name="submit_button" value="Select Account">

</form>

Когда я нажимаю «Выбрать учетную запись», я получаю ошибку 'int' object has no attribute 'id'. Я подумал, что это может быть проблема с типом данных, поэтому я попытался со списком строк, но безрезультатно.

У меня вопрос, как мне заполнить свой SelectField из списка?

1 Ответ

0 голосов
/ 16 января 2020

Когда вы GET этот маршрут, он будет загружать форму, общую c и отображать ее на странице, без каких-либо myField3 вариантов, которые были установлены или доступны.

Вы можете управлять форма для загрузки на основе определенных критериев с помощью переопределения __init__:

class ToolForm(FlaskForm):
    myField3 = SelectField(u'Select Account', choices=[], coerce=int)
    def __init__(self, accounts=None):
        super().__init__()  # calls the base initialisation and then...
        if accounts: 
            self.myField3.choices = [(c.id, c.name) for c in accounts]

Затем вы создадите форму из некоторой другой информации на основе запроса маршрута:

   @app.route("/test", methods=['GET', 'POST'])
   def test():
       # define accounts
       form = ToolForm(accounts=accounts)     
...