我正在构建一个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'}
答案 0 :(得分:0)
我认为你是倒退的。表单只是用户提交的HTTP表单的表示形式。您希望使用它来阻止格式错误的表单提交绑定到您的api类的模型。这样做的方法不是管理表单中的修改属性,而是在表单中试图保护的模型中。
在下面的示例中,我们使用WTForms来保护模型User
。 Form
对象将拥有用户在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')
这导致以下结果。如果没有提供该属性,则旧值会增加。如果它被提供并且它相同,它只会覆盖现有属性而不起作用。如果该属性已被编辑且有效,则新值将覆盖旧值。