WTForms 动态表单及可配置验证
我正在构建一个系统,让管理员用户可以往数据库里添加“问题”。每种类型的问题都有一个对应的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