【问题标题】:Form validation with WTForms and and autofill SQLAlchemy model with form data in Flask使用 WTForms 进行表单验证,并在 Flask 中使用表单数据自动填充 SQLAlchemy 模型
【发布时间】:2013-01-06 21:07:21
【问题描述】:

我有一个表单,我必须对其进行验证,然后将数据保存在数据库中。我有一个名为CampaignSQLAlchemy 模型,看起来像这样

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)

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

【问题讨论】:

    标签: python flask flask-sqlalchemy flask-wtforms


    【解决方案1】:

    sqlalachemy 有 wtforms 扩展:

    还有一些东西可以帮助你

    来自链接:

    from flaskext.wtf import Form
    from wtforms.ext.appengine.db import model_form
    from models import MyModel
    
    MyForm = model_form(MyModel, Form)
    

    【讨论】:

    • 在 (this)[flask.pocoo.org/snippets/60/] 方法中,我必须在 field_argsmodel_form 参数中传递验证器。我不能使用我的表单类CampaignForm吗?
    • @lovesh 不,您可以使用 field_args 扩展数据。
    【解决方案2】:

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

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

    还可以查看docs

    【讨论】:

    • 太好了。有什么办法可以避免为表单和数据库生成一次相同的逻辑类?可以为两者生成一个类吗?
    • @famargar 不确定我是否理解你的问题?
    【解决方案3】:

    你也可以这样做:

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

    并将用户发送到所需的页面

    【讨论】:

      猜你喜欢
      • 2016-06-23
      • 1970-01-01
      • 2016-05-30
      • 2019-09-26
      • 2020-01-30
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      • 1970-01-01
      相关资源
      最近更新 更多