Python WTForms具有可配置验证的动态表单

Python WTForms具有可配置验证的动态表单,python,flask,wtforms,flask-wtforms,Python,Flask,Wtforms,Flask Wtforms,我正在构建一个允许管理员用户向数据库添加“问题”的系统。每种类型的问题都有一个关联的WTForms对象。为了显示一个页面,我循环所有问题,并为每个问题生成一个由表单字段组成的表单 class TextQuestionForm(Form): value = TextField("Value", validators=[]) class Question(db.Model): # sqlAlchemy model using single table inheritance def f

我正在构建一个允许管理员用户向数据库添加“问题”的系统。每种类型的问题都有一个关联的WTForms对象。为了显示一个页面,我循环所有问题,并为每个问题生成一个由表单字段组成的表单

class TextQuestionForm(Form):
  value = TextField("Value", validators=[])

class Question(db.Model):
  # sqlAlchemy model using single table inheritance
  def field_name(self):
    return "question_%s" % self.id

class TextQuestion(Question):
  form = TextQuestionForm


def get_form(page_id):
  questions = Question.query.filter(Question.page_id == page_id).all()

  class F(Form):
    pass

  for q in questions:
    setattr(F, q.field_name(), FormField(q.form))

  return F()
这适用于简单的情况,其中给定问题类型的所有验证都相同,但我需要为
问题的每个实例提供可配置的验证选项,例如,假设我的问题模型已扩展:

class Question(db.Model):
  # ... other fields
  min_length = db.Column(db.Integer, nullable=True)
  max_length = db.Column(db.Integer, nullable=True)

考虑到每个问题的最小/最大长度不同(或缺失),将WTForms长度验证器置于我的表单字段中的
字段的适当方式是什么
您可以创建一个自定义字段继承
TextField
并重新定义
pre_validate
方法

def pre_validate(self, form=None)
在该函数中,您可以执行所有需要的检查


我的意思是,我认为这比你想象的要复杂一些。首先,字段最好作为静态类属性,否则您会一直将它们存储在数据库中,并且它们会受到sql操作的影响。第二,当原始表单数据出现时,您需要知道表单数据所指的问题类。您最好只提交一个附加字段,提示自定义字段验证器处理该类型问题的一些特殊字段。那么你只需要一个问题模型。