Я создаю систему, которая позволяет администраторам добавлять «вопросы» в базу данных. У каждого типа вопроса есть связанный с ним объект 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
поле в моей форме поля, учитывая, что мин/макс длина будет отличаться (или отсутствует) для каждого вопроса?
Я имею в виду, я думаю, что это немного сложнее, чем вы это делаете. Если поля будут лучше, чем атрибуты статического класса, в противном случае вы будете хранить их в db все время, и они будут подвержены обработке sql. Во-вторых, когда появились данные необработанной формы, вам нужно знать, какой класс Question, из которого формируются данные. Возможно, вам лучше всего просто добавить добавочное поле, которое проверило настраиваемое поле проверки правильности в отношении некоторых специальных полей обработки для этого типа вопроса. Тогда вам понадобится только одна модель вопроса. – nsfyn55