4

当 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?
4

2 回答 2

1

当您post调用validate()WTForms 时,会将表单编码数据绑定到Form实例。httpPOST可以像这样返回响应,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实例。

于 2014-05-24T17:53:04.693 回答
0

这是一个可能有助于解决您的问题的工作流程。我选择提供工作流程而不是特定的代码片段,以避免在您用来解决问题的技术中过于规范。

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
于 2013-09-21T22:44:41.727 回答