Я думаю, что вы едете на это назад. Форма представляет собой просто представление формы HTTP, представленной пользователем. Вы хотите использовать его, чтобы прекратить подавать неверные формы из привязки к моделям ваших классов api. Способ сделать это не для управления измененными атрибутами в вашей форме, а в модели, которую ваша форма пытается защитить.
В приведенном ниже примере мы используем WTForms для защиты модели User
. Объект Form
будет иметь то, что пользователь поставил в своем POST
. Модель User
будет представлять действительные данные, которые были получены из хранилища. Мы хотим предотвратить добавление POST
в данные, которые были изменены в текущей модели. Если переданные данные проходят проверку, мы хотим переписать свойства в модели с данными, которые теперь мы имеем в виду. Это означает, что может произойти только один из трех сценариев. Допустимы два простых: либо введенные поля действительны, либо нет. Если одно или несколько полей недействительны, вы не получаете представление. Третий немного сложнее и требует, чтобы вы приняли решение в своем апи. Если поле опущено, вам необходимо решить, что 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', почему вы можете напрямую ее изменить? –