【发布时间】:2013-02-21 18:36:05
【问题描述】:
我正在构建一个允许管理员用户向数据库添加“问题”的系统。每种类型的问题都有一个与之关联的 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)
鉴于每个问题的最小/最大长度不同(或缺失),将 WTForms 长度验证器添加到我的表单字段中的 value 字段的适当方法是什么?
【问题讨论】:
-
我的意思是我认为这比你想象的要复杂一些。首先,这些字段作为静态类属性会更好,否则您将一直将它们存储在数据库中,并且它们会受到 sql 操作的影响。其次,当原始表单数据进入时,您需要知道表单数据所指的 Question 类。您最好只提交一个附加字段,该字段提示自定义字段验证器针对该类型问题的某些特殊处理字段。那么你只需要一个问题模型。
标签: python flask wtforms flask-wtforms