使用Flask-WTForm将多个WTForm字段映射到一个属性

时间:2016-06-12 10:12:56

标签: python flask wtforms flask-wtforms

我有一个正确映射到我的模型的表单。我想要做的是让用户使用三个SelectField(日,月,年)输入他们的出生日期,并将这三个值的组合写入我的model.dateOfBirth。我知道现有的DateFieldDateTimeField选项,但它们都不合适。

我使用FormField尝试了此操作,但是当我在整个表单populate_obj上调用'str' object has no attribute 'day'时它失败了,假设它正在尝试设置model.dateOfBirth.day当然,不存在。

我可以从form.data提取所有相关数据并写入populate_obj之外的模型,但我似乎无法移除dateOfBirth数据以停止populate_obj从失败。关于如何在表单创建时传递obj时我可以预填表单数据当然还有其他问题,但我现在愿意牺牲它。

我看过使用FieldList,但文档说它将所有数据都放回到列表中,而不是dict,这仍然会给我同样的问题

表单

class DOBForm(Form):

    day = SelectField(u'Please enter your date of birth',
        choices=days,
        validators=[InputRequired(message=u' ')]
    )

    month = SelectField(u' ',
        choices=months,
        validators=[InputRequired(message=u' ')]
    )

    year = SelectField(u' ',
        choices=years,
        validators=[InputRequired(message=u' ')]
    )

class MainForm(Form):

    dateOfBirth = FormField(DOBForm)

模型

class Model

    dateOfBirth = db.Column('dateOfBirth', Date)

1 个答案:

答案 0 :(得分:0)

你可以为此编写一个函数。

from datetime import datetime
def date_of_birth(**kwargs):
    day = kwargs['day']
    month = kwargs['month']
    year = kwargs['year']
    strip="-"
    seq = (day,month,year)
    date = datetime.strptime(strip.join(seq) , '%d-%m-%Y')
    birthday = stringDate.strftime('%d-%m-%Y')
    dob = Model()
    dob.dateOfBirth = birthday
    session = Session()
    session.add(dob)
    session.commit()
    retval = row2dict(dob)
    session.close()
    return retval

现在你可以调用这个函数了。 我还没有测试过这个功能。如果您收到任何错误或有任何疑问,请与我们联系。