2013-01-23 29 views
3

我有一個表單,必須驗證並將數據保存到數據庫中。我有一個SQLAlchemy模式叫Campaign它看起來像這樣使用WTForms進行表單驗證和使用Flask中的表單數據自動填充SQLAlchemy模型

from flask.ext.sqlalchemy import SQLAlchemy 

db = SQLAlchemy() 
class Campaign(db.Model): 
    __tablename__ = 'campaigns' 

    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(50)) 
    priority = db.Column(db.SmallInteger) 
    starts_at = db.Column(db.Date) 
    ends_at = db.Column(db.Date) 
    .... bla bla bla 

現在我有一個WTForm形式這樣

from flask.ext.wtf import Form, TextField, IntegerField, DateField, Required, NumberRange 
class CampaignForm(Form): 

    def date_validation(form, field): 
     #some validation on date 

    name = TextField(validators=[Required()]) 
    priority = IntegerField(validators=[Required(), NumberRange(min=1,max=100)]) 
    start_date = DateField(validators=[Required(), date_validation]) 
    end_date = DateField(validators=[Required(), date_validation]) 
    ... bla bla bla 

現在驗證,驗證和保存表單數據,我可以這樣做這是我的view

code in Flask

class CampaignsView(MethodView): 
    def post(self): 
     """ 
     For creating a new campaign 
     """ 
     form = CampaignForm(request.form) 
     if form.validate(): 
      campaign = Campaign(form.name.data, form.priority.data, and so on) 
      session.add(campaign) 

現在上面的代碼是愚蠢的,因爲我必須硬編碼視圖中的每個字段名稱。有沒有其他的方式可以填補我的模型領域與表單域? 感謝

回答

7

可以使用.populate_obj方法是這樣的:

if form.validate_on_submit(): 
    campaign = Campaign() 
    form.populate_obj(campaign) 

還檢查了在這個docs

+0

太好了。有什麼辦法可以避免爲表單生成一次相同的邏輯類,並且一次爲數據庫生成一次?人們能爲兩者生成一個類嗎? – famargar

+0

@famargar不知道我是否理解你的問題? –

3

存在對sqlalachemy wtforms擴展:

還有些事情可以幫助你

從鏈接:

from flaskext.wtf import Form 
from wtforms.ext.appengine.db import model_form 
from models import MyModel 

MyForm = model_form(MyModel, Form) 
+0

在(本)[http://flask.pocoo.org/snippets/60/]我必須在'model_form'的'field_args'參數中傳遞驗證器。不能使用我的表單類'CampaignForm'? – lovesh

+0

@lovesh否,您可以使用field_args擴展數據。 – Efazati

0

你也可以做這樣的事情:

if request.method == 'POST' and form.validate() == True: 
    create new user 

與用戶發送到所需的頁面

相關問題