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

Python 仅将修改后的表单数据绑定到类,python,wtforms,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 = Strin

我正在构建一个
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\u name':'Edited','last\u name':'last name'}


相反,我得到:
{'first_name':'first name','last_name':'last name'}

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

在下面的示例中,我们使用WTForms来保护模型
用户
表单
对象将具有用户在其
帖子中提供的内容,
用户
模型将表示从存储器中检索到的有效数据。我们希望防止
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')

这将导致以下结果。如果未提供属性,则旧值将保持不变。如果提供的属性相同,则只会覆盖现有属性而不产生任何效果。如果属性已编辑且有效,则新值将覆盖旧值。

既然您可以访问
user
变量,为什么您可以直接从那里更改它?