如何循环 RadioField 列表
How to Loop Through RadioField List
如何遍历 wtform RadioFields 列表?我试图通过以下代码实现这一点:
下面是我的 .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
WTForms 基于 python 的 类 元编程,并且默认情况下一切正常工作都期望您在特定时间执行特定操作。为了使字段起作用,它们应该被绑定(通常是一个表单),并且 WTForms 通过特殊的 meta-class DefaultMeta during form init. But WTForms needs to know what fields to bind and those field are stored in _unbound_fields list 绑定字段。因此,在您的情况下,为避免元编程的复杂性,一个简单的解决方案是将新创建的字段附加到 _unbound_fields before super().__init__() 调用,因此 WTForms 将在初始化过程中为您绑定它。
P.S。另外,recipes from here might be useful too.
如何遍历 wtform RadioFields 列表?我试图通过以下代码实现这一点:
下面是我的 .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
WTForms 基于 python 的 类 元编程,并且默认情况下一切正常工作都期望您在特定时间执行特定操作。为了使字段起作用,它们应该被绑定(通常是一个表单),并且 WTForms 通过特殊的 meta-class DefaultMeta during form init. But WTForms needs to know what fields to bind and those field are stored in _unbound_fields list 绑定字段。因此,在您的情况下,为避免元编程的复杂性,一个简单的解决方案是将新创建的字段附加到 _unbound_fields before super().__init__() 调用,因此 WTForms 将在初始化过程中为您绑定它。
P.S。另外,recipes from here might be useful too.