2013-02-21 67 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) 

會是什麼,因爲最小/最大長度會有所不同(或失蹤),對每個問題的適當辦法讓我的表單字段中的value領域WTForms長度驗證?

+0

我的意思是我覺得這比你做出來的要複雜一些。首先,字段會更好,因爲靜態類的屬性,否則你會一直存儲在數據庫中,他們會受到sql操作。其次,當原始表單數據進來時,您需要知道表單數據所涉及的Question類。您可能最好只提交一個引導自定義字段驗證程序的附加字段,以關於該類型問題的某些特殊處理字段。那麼你只需要一個問題模型。 – nsfyn55 2014-05-29 16:30:49

回答