WTForms: передача значений формы обратно пользователю при публикации

Когда оба метода GET и POST находятся в одном классе обработчика, и я хочу заполнить поля формы с помощью ввода пользователем после неудачной проверки формы, я делаю это …

Class CommentHandler(BaseHandler): def get(self, form=None): if form is None: # create new form unless populated form is passed in form = CommentForm() # query DB and create template context self.render('page.html', **context) def post(self): form = CommentForm(self.request.POST) if form.validate(): # populate entity with form data and save to DB return self.redirect_to('page') self.get(form=form) # pass populated form back to user for editing 

Я не знаю, является ли это лучшим способом вернуть данные формы пользователю, но, похоже, это работает. Мой вопрос: как передать эти данные в форму, если методы GET и POST находятся в разных классах обработчиков?

 class PageHandler(BaseHandler): def get(self): # displays form to user class CommentHandler(BaseHandler): def post(self): # processes POSTed form data... # but if form.validate() fails, # how can I pass the form data back to the user # so they can edit their form input? 

Когда вы публикуете и вызываете validate() WTForms связывает данные, закодированные в Form экземпляром Form . HTTP POST может возвращать ответ так же, как GET поэтому вы иногда получаете эти забавные сообщения в своем браузере, когда серверное приложение не провело проверку, и вы пытаетесь обновиться. Это связано с тем, что действие обновления будет вызывать конвейер обработки GET и вы потеряете данные POST .

Что вам нужно сделать вместо того, чтобы делегировать обратно в реализацию get вам просто нужно дать ответ от вашей реализации post которая передает экземпляр Form с данными, привязанными к нему в ответ. Если вы настроили шаблон соответствующим образом, данные автоматически появятся в соответствующих полях. Ниже приведен фрагмент того, как может выглядеть ваш Handler .

 def post(self): form = CommentForm(self.request.POST) if form.validate(): # populate entity with form data and save to DB return self.redirect_to('page') # If we are here it means we failed validation # We need to send back the data the use supplied # with error messages so we can re-render the form # with their data and error messages indicating why # it was rejected. self.render('page.html', form=form) # pass populated form back to user for editing 

Это, конечно, предполагает, что ваш page.html знает, что делать с экземпляром Form .

Вот один рабочий процесс, который может помочь решить вашу проблему. Я решил предоставить рабочий процесс вместо определенного фрагмента кода, чтобы избежать чрезмерной предписания в технологии, которую вы используете для решения проблемы.

 GET if session contains form data: add form data from session to template context display form POST if form validates: clear this form data from session save to db else: save form data to session redirect to GET handler