Python WTForms具有可配置验证的动态表单
我正在构建一个允许管理员用户向数据库添加“问题”的系统。每种类型的问题都有一个关联的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
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操作的影响。第二,当原始表单数据出现时,您需要知道表单数据所指的问题类。您最好只提交一个附加字段,提示自定义字段验证器处理该类型问题的一些特殊字段。那么你只需要一个问题模型。