仅将修改后的表单数据绑定到类

时间:2014-02-04 12:54:59

标签: python wtforms

我正在构建一个API端点,它只接收更改的字段。其他字段从现有对象中获取。下面是我的代码的简化版本。

from wtforms import Form
from wtforms.fields import StringField

class User(object):
    first_name = ""
    last_name = ""

class UpdateForm(Form):
    first_name = StringField()
    last_name = StringField()

user = User()
user.first_name = 'First name'
user.last_name = 'Last name'
form = UpdateForm(formdata=None, data={'first_name':'Edited'}, obj=user)

我希望form.data为:{'first_name': 'Edited', 'last_name': 'Last name'}

相反,我得到:{'first_name': 'First name', 'last_name': 'Last name'}

1 个答案:

答案 0 :(得分:0)

我认为你是倒退的。表单只是用户提交的HTTP表单的表示形式。您希望使用它来阻止格式错误的表单提交绑定到您的api类的模型。这样做的方法不是管理表单中的修改属性,而是在表单中试图保护的模型中。

在下面的示例中,我们使用WTForms来保护模型UserForm对象将拥有用户在POST User模型中提供的内容,它将代表从存储中检索到的有效数据。我们希望阻止POST在当前有效的模型中添加格式错误的数据。如果提交的数据通过验证,我们希望用我们现在有效的数据覆盖模型中的属性。这意味着只能发生三种情况中的一种。两个简单的是提供的字段是否有效。如果一个或多个字段无效,则提交失败。第三个是更复杂一点,需要你在api做出决定。如果省略某个字段,则需要确定忽略了None,或者您想要使用None覆盖关联的属性。关键是无论财产是否被编辑或保持不变都是无关紧要的。唯一真正的问题是它是否有效。

以下示例演示了这应该如何运作:

from wtforms import Form
from wtforms.fields import StringField

class User(object):
    first_name = ""
    last_name = ""

class UpdateForm(Form):
    first_name = StringField()
    last_name = StringField()

data = {'first_name':'EDITED'}

form = UpdateForm(obj=Struct(**data))

# this is for the purpose of creating 
# an existing user. We assume you are
# considering getting this out of a db
user = User()
user.first_name = 'OLD First name'
user.last_name = 'OLD Last name'

if form.data.get('first_name'):
    user.first_name = form.data.get('first_name')

if form.data.get('last_name'):
    user.last_name = form.data.get('last_name')

这导致以下结果。如果没有提供该属性,则旧值会增加。如果它被提供并且它相同,它只会覆盖现有属性而不起作用。如果该属性已被编辑且有效,则新值将覆盖旧值。