Как перебрать список радиополей - PullRequest
0 голосов
/ 31 января 2019

Как я могу просмотреть список радиополей wtform?Я попытался добиться этого с помощью следующего кода:

Ниже приведен мой код в моем .py файле.Код, который генерирует поля, находится в init методе.

from flask import (Flask, render_template, request,
                session, url_for, redirect)
from flask_wtf import FlaskForm
from wtforms import SubmitField, RadioField, StringField

app = Flask(__name__)
app.config['SECRET_KEY'] = 'my_secret'

class AssessmentForm(FlaskForm):
    """Questionnaire Assessment Form"""

    submit = SubmitField('Submit')

    def __init__(self):
        super().__init__()

        #Get Activity Questions
        f = open(r'my_path\questions.txt','r')
        q = f.readlines()
        q = [s.strip() for s in q]
        f.close()
        self.questions = q

        #Create 60 rows of 5 radio buttons
        self.radio_row = []
        for i in range(60):
            #row of 5 radio fields
            rr = RadioField(label=f'row{i+1}',choices=[('s_dis', 'Strongly Dislike'), 
                                    ('dis', 'Dislike'),
                                    ('unsure', 'Unsure'),
                                    ('dis', 'Like'),
                                    ('s_like', 'Disagree')])
            self.radio_row.append(rr)

@app.route('/', methods=['GET','POST'])
def assessment():
    form = AssessmentForm()

    if form.validate_on_submit():
        return redirect(url_for('results'))

    return render_template('questionnaire.html', form=form)

@app.route('/results')
def results():
    return render_template('results.html')

if __name__ == "__main__":
    app.run(debug=True)

Когда я пытаюсь это сделать, я получаю следующую ошибку:

 TypeError: 'UnboundField' object is not iterable

1 Ответ

0 голосов
/ 31 января 2019

WTForms основаны на метапрограммировании классов Python и для того, чтобы все работало правильно, по умолчанию ожидает от вас определенных действий в определенное время.Чтобы поля работали, они должны быть связаны (обычно с формой), а WTForms связывает поля через специальный мета-класс DefaultMeta во время инициализации формы .Но WTForms нужно знать, какие поля связывать, и эти поля хранятся в _unbound_fields list .Таким образом, в вашем случае, чтобы избежать сложностей метапрограммирования, простое решение состоит в том, чтобы добавить вновь созданные поля в _unbound_fields до вызова super () .__ init __ (), поэтому WTForms свяжет его для вас.во время процесса инициализации.

PS Также здесь могут быть полезны рецепты .

...