2013-02-21 3 views
0

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

+0

Я имею в виду, я думаю, что это немного сложнее, чем вы это делаете. Если поля будут лучше, чем атрибуты статического класса, в противном случае вы будете хранить их в db все время, и они будут подвержены обработке sql. Во-вторых, когда появились данные необработанной формы, вам нужно знать, какой класс Question, из которого формируются данные. Возможно, вам лучше всего просто добавить добавочное поле, которое проверило настраиваемое поле проверки правильности в отношении некоторых специальных полей обработки для этого типа вопроса. Тогда вам понадобится только одна модель вопроса. – nsfyn55

ответ

0

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

def pre_validate(self, form=None) 

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

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