在 WTForms (Flask) 中使用单个 class 创建多个输入元素
Create multiple input elements using single class in WTForms (Flask)
我正在 Flask 中制作一个网络应用程序以生成 XML 以导入到 Excel。该网络应用程序有一个表格,其中有 15 个问题、4 个问题选项、正确答案和一个计时器。
这是我的 forms.py
,它正在使用 WTForms:
from flask_wtf import FlaskForm
from wtforms import StringField, SelectField, IntegerField, SubmitField
from wtforms.validators import DataRequired, Length
class XMLQuestionForm(FlaskForm):
question = StringField('Question', validators=[DataRequired(), Length(max=395)])
optionA = StringField('Option A', validators=[DataRequired(), Length(max=85)])
optionB = StringField('Option B', validators=[DataRequired(), Length(max=85)])
optionC = StringField('Option C', validators=[DataRequired(), Length(max=85)])
optionD = StringField('Option D', validators=[DataRequired(), Length(max=85)])
answer = SelectField('Answer', validators=[DataRequired()], choices=[('Option A','Option B','Option C','Option D')])
timer = IntegerField('Timer', default=60)
现在,我想创建一个 HTML 文件,其中可以输入和提交 15 个不同的问题、选项和答案。提交后,我会在routes.py
处理
这是我的 routes.py
:
from flask import render_template, url_for, flash, redirect
from myflaskapp import app
@app.route("/")
@app.route("/home",)
def home():
form = XMLQuestionForm()
if form.validate_on_submit():
#Do something
else:
flash('ERROR MESSAGE', 'danger')
return render_template('home.html', title='Questions XML Form', form=form)
我想拥有 15 个我上面提到的字段,而不必创建多个表单 class 变量。
我该怎么做?
我将保留对这种方法的效率或适当性的判断,但一种可能的做法是作为工厂功能:
def create_form(input):
class Form(FlaskForm):
timer = IntegerField('Timer', default=60)
kwargs = {'validators': [DataRequired(), Length(max=85)]}
for i, vals in enumerate(input):
setattr(Form, 'questn_' + str(i), StringField(vals[0], **kwargs))
setattr(Form, 'answer_' + str(i), StringField(vals[1], **kwargs))
for j, opt in enumerate(vals[2]):
setattr(Form, 'opt_' + str(i) + str(j), StringField(opt, **kwargs))
return Form
Form = create_form([
['Question1', 'Answer1', ['OptA', 'OptB', 'OptC']],
['Question2', 'Answer2', ['OptX', 'OptY']]
])
我正在 Flask 中制作一个网络应用程序以生成 XML 以导入到 Excel。该网络应用程序有一个表格,其中有 15 个问题、4 个问题选项、正确答案和一个计时器。
这是我的 forms.py
,它正在使用 WTForms:
from flask_wtf import FlaskForm
from wtforms import StringField, SelectField, IntegerField, SubmitField
from wtforms.validators import DataRequired, Length
class XMLQuestionForm(FlaskForm):
question = StringField('Question', validators=[DataRequired(), Length(max=395)])
optionA = StringField('Option A', validators=[DataRequired(), Length(max=85)])
optionB = StringField('Option B', validators=[DataRequired(), Length(max=85)])
optionC = StringField('Option C', validators=[DataRequired(), Length(max=85)])
optionD = StringField('Option D', validators=[DataRequired(), Length(max=85)])
answer = SelectField('Answer', validators=[DataRequired()], choices=[('Option A','Option B','Option C','Option D')])
timer = IntegerField('Timer', default=60)
现在,我想创建一个 HTML 文件,其中可以输入和提交 15 个不同的问题、选项和答案。提交后,我会在routes.py
这是我的 routes.py
:
from flask import render_template, url_for, flash, redirect
from myflaskapp import app
@app.route("/")
@app.route("/home",)
def home():
form = XMLQuestionForm()
if form.validate_on_submit():
#Do something
else:
flash('ERROR MESSAGE', 'danger')
return render_template('home.html', title='Questions XML Form', form=form)
我想拥有 15 个我上面提到的字段,而不必创建多个表单 class 变量。
我该怎么做?
我将保留对这种方法的效率或适当性的判断,但一种可能的做法是作为工厂功能:
def create_form(input):
class Form(FlaskForm):
timer = IntegerField('Timer', default=60)
kwargs = {'validators': [DataRequired(), Length(max=85)]}
for i, vals in enumerate(input):
setattr(Form, 'questn_' + str(i), StringField(vals[0], **kwargs))
setattr(Form, 'answer_' + str(i), StringField(vals[1], **kwargs))
for j, opt in enumerate(vals[2]):
setattr(Form, 'opt_' + str(i) + str(j), StringField(opt, **kwargs))
return Form
Form = create_form([
['Question1', 'Answer1', ['OptA', 'OptB', 'OptC']],
['Question2', 'Answer2', ['OptX', 'OptY']]
])