在 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']]
])