2014-02-04 4 views
2

Я создаю конечную точку 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

Поскольку у вас есть доступ к переменной 'user', почему вы можете напрямую ее изменить? –

ответ

0

Я думаю, что вы едете на это назад. Форма представляет собой просто представление формы 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') 

Это приводит к следующему. Если свойство не указано, старое значение сохраняется. Если он будет поставлен и его одно и то же, он просто перезапишет существующее свойство. Если свойство было отредактировано и выполнено, новое значение перезапишет старый.

Смежные вопросы