使用WTForms进行表单验证,并使用Flask中的表单数据自动填充SQLAlchemy模型

lov*_*esh 3 python flask flask-sqlalchemy flask-wtforms

我有一个表单,我必须验证,然后将数据保存在数据库中.我有一个看起来像这样的SQLAlchemy模型Campaign

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
Run Code Online (Sandbox Code Playgroud)

现在我有一个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
Run Code Online (Sandbox Code Playgroud)

现在要验证并保存表单数据,我可以做类似这样的事情 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)
Run Code Online (Sandbox Code Playgroud)

现在上面的代码是愚蠢的,因为我必须在视图中硬编码每个字段名称.还有其他方法可以用表单字段填充模型的字段吗?谢谢

Ale*_*per 8

您可以像这样使用.populate_obj方法:

if form.validate_on_submit():
    campaign = Campaign()
    form.populate_obj(campaign)
Run Code Online (Sandbox Code Playgroud)

另请查看有关此文档的文档.