Динамические формы 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)

Каким будет подходящий способ получить валидатор длины WTForms для поля value в моем поле формы, учитывая, что минимальная/максимальная длина будет разной (или отсутствовать) для каждого вопроса?


person adharris    schedule 21.02.2013    source источник
comment
Я имею в виду, я думаю, что это немного сложнее, чем вы это представляете. Во-первых, лучше было бы использовать поля в качестве атрибутов статического класса, иначе вы бы все время хранили их в базе данных, и они подвергались бы манипуляциям с SQL. Во-вторых, когда поступят необработанные данные формы, вам нужно будет знать, к какому классу Вопроса относятся эти данные формы. Возможно, вам лучше всего просто отправить дополнительное поле, которое укажет валидатору настраиваемого поля некоторые поля специальной обработки для этого типа вопроса. Тогда вам понадобится только одна модель вопроса.   -  person nsfyn55    schedule 29.05.2014


Ответы (1)


Чтобы иметь полный контроль над проверкой, вы можете создать настраиваемое поле, наследующее TextField, и переопределить метод pre_validate.

def pre_validate(self, form=None)

и внутри этой функции вы можете делать все проверки, которые хотите

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

person d3m    schedule 19.03.2013