1

管理者ユーザーがデータベースに「質問」を追加できるシステムを構築しています。各タイプの質問には、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長さバリデーターを配置する適切な方法は何でしょうか?

4

1 に答える 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

于 2013-03-19T11:53:09.673 に答える