Как отслеживать изменения полей формы в Flask-WTF?

У меня есть модель с полем участников, как показано ниже:

class Team(db.Model):
    --- some fields ---
    members = ListProperty(db.Key) # Using App Engine datastore as backend.

Я использую Flask-WTFforms для создания формы с использованием этой модели. При создании новой команды пользователь выберет некоторых участников в форме и сохранит ее. Пользователь также может редактировать форму команды и вносить изменения в поле участников (может добавлять или удалять участников). Я хотел проверить, сколько участников добавлено или удалено, сравнив его с предыдущими данными, хранящимися в поле участников. То же самое относится и к другим полям.

Я использовал сеансы для достижения этого:

def edit_team (ключ):

k = db.Key(key)
team = db.get(k)
form = TeamForm(obj = team)
if not form.is_submitted(): # Indicates GET request
    session[str(g.user.user_id() + 'prev_members'] = form.members.data
if form.validate_on_submit():
    form.populate_obj(project)
    # I will use session data with new form.members.data to do further processing.

Это правильный способ справиться с этим сценарием? Спасибо за любую помощь..


person rajpy    schedule 14.05.2013    source источник


Ответы (1)


проблема с вашим кодом

team = db.get(k)
form = TeamForm(obj = team)

если запрос был GET, данные объекта должны быть загружены из модели. однако, если запрос был POST (или PUT, PATCH), это означает, что вам нужно прочитать тело запроса, чтобы сформировать правильное обновление модели. похоже, вы используете переменную k в качестве ключа к индикатору модели.

k = db.Key(key)
team = db.get(k)
if request.method == "GET":
    # create form from the model
    form = TeamForm(obj = team)

elif request.method == "POST":
    # update model with the form
    form = TeamForm() #flask-wtf automatically reads from request object
    # validate, update, delete, ...
person thkang    schedule 14.05.2013
comment
Спасибо за ответ. Мой метод работает так же, как и ваш. Если validate_on_submit() имеет значение False, это считается запросом GET, и форма создается с использованием form = TeamForm(obj=team), если validate_on_submit() имеет значение True, это считается запросом POST. Я хотел бы сохранить данные формы в запросе GET и обработать их в запросе POST. Также я могу отслеживать, что изменилось. Подробнее о validate_on_submit(): этот метод, в свою очередь, вызывает form.is_submitted() и form.validate(). Метод is_submitted() отличает GET от POST. - person rajpy; 14.05.2013