【问题标题】:WTForms: passing form values back to the user on postWTForms:在帖子中将表单值传回给用户
【发布时间】:2012-07-21 14:13:03
【问题描述】:

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

【问题讨论】:

    标签: python webapp2 wtforms


    【解决方案1】:

    当您post 并调用validate() 时,WTForms 会将表单编码数据绑定到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 实例。

    【讨论】:

      【解决方案2】:

      这是一个可能有助于解决您的问题的工作流程。我选择提供工作流程而不是特定代码 sn-p 是为了避免对您用来解决问题的技术过于规范。

      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
      

      【讨论】:

        猜你喜欢
        • 2012-10-14
        • 1970-01-01
        • 2018-02-08
        • 2013-11-07
        • 1970-01-01
        • 2021-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多