【问题标题】:WTForms dynamic forms with configurable validation具有可配置验证的 WTForms 动态表单
【发布时间】: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


【解决方案1】:

完全控制验证 您可以创建一个自定义字段继承TextField 并重新定义pre_validate 方法

def pre_validate(self, form=None)

在这个函数中,你可以做所有你想做的检查

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 2016-05-30
    • 2019-04-05
    • 2018-12-26
    • 2020-01-18
    • 2016-06-17
    相关资源
    最近更新 更多