WTForms 动态表单及可配置验证

1 投票
1 回答
2992 浏览
提问于 2025-04-17 16:40

我正在构建一个系统,让管理员用户可以往数据库里添加“问题”。每种类型的问题都有一个对应的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()

这种方法在简单的情况下效果很好,比如当某种问题类型的验证规则都是一样的时候。但我需要为每个Question实例提供可配置的验证选项。比如,想象一下我的问题模型被扩展了:

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

那么,如何在我的表单字段中的value字段上添加一个WTForms的长度验证器呢?因为每个问题的最小和最大长度可能都不一样(或者根本没有)?

1 个回答

0

如果你想完全掌控验证的过程,可以创建一个自定义字段,继承自 TextField,并重新定义 pre_validate 方法。

def pre_validate(self, form=None)

在这个函数里,你可以进行你想要的所有检查。

http://wtforms.simplecodes.com/docs/0.6/fields.html#wtforms.fields.Field.pre_validate

撰写回答