使用来自WTForms的数据填充App Engine NDB实体

时间:2015-01-06 05:33:12

标签: python google-app-engine flask google-cloud-datastore wtforms

我正在寻找一种更优雅的方式来从WTForms模型填充App Engine数据存储区实体,而无需一次分配一个属性。

我记得在getattr()看到了类似的事情。

编辑个人资料页面的WTForm模型,如下所示:

class EditProfile(Form):
    first_name = StringField('First Name')
    last_name = StringField('Last Name')
    [...]

用户的NDB模型:

class User(ndb.Model):
    first_name = ndb.StringProperty()
    last_name = ndb.StringProperty()
    [...]

注意:两个模型的所有属性名称相同。

编辑个人资料页面的请求处理程序:

@app.route('/edit_profile', methods=['GET', 'POST'])
@login_required
def edit_profile():
    form = EditProfile()

    if request.method == 'POST':
        if form.validate_on_submit():
            user = User.get_by_id(session.get('user_id'))

            ???

            user.put()

2 个答案:

答案 0 :(得分:3)

使用populate_obj方法。

  

使用表单中的数据填充传递的obj的属性   字段。

form.populate_obj(user)
user.put()

答案 1 :(得分:2)

像......这样的东西:

for field in dir(form):
    if field.startswith('_'): continue  # skip private stuff
    if not user.hasattr(field): continue  # skip non-corresponding stuff
    value = getattr(form, field)
    setattr(user, field, value)

可能存在细微之处,例如关于类型(需要某些字段的类型转换)或甚至更高级的(可能我们需要使用User.hasattr,即在类上,而不是实例),但这是一个通常是在两种不同类实例之间转录同名,兼容类型字段的良好起点。