在金字塔中将表单参数传递给隐藏表单的更好方法

时间:2011-12-07 22:42:07

标签: python forms pyramid

在之前的question中,我试图找出在Pyramid中的表单之间传递数据的正确策略。根据我收到的答案,我决定使用隐藏表格的方法。

我开始实现这一点,并认为必须有更好的传递数据的方法。具体来说,通过url传递参数会产生一个乱解的元组。

我希望它足够通用,不知道表单有哪些参数,也需要处理文件字段。

我目前是如何尝试将表单数据传递到确认页面的:

@view_config(renderer="templates/derived/load/error.mak", route_name='process_model_route')
def process_model(self):
    #processing logic and validaton, failiure in validation sends user to error.mak
    return HTTPFound(route_url('confirm_model_route', self.request, fparams=self.request.POST))

路线:config.add_route('confirm_model_route', 'rnd2/model/confirm/*fparams')

@view_config(renderer="templates/derived/confirm/model.mak", route_name='confirm_model_route')
def confirm_model(self):
    form_dict = self.request.matchdict['fparams']
     #need to decode and pass to template
     return dict({'load_route':load_route, 'form_dict':form_dict})

confirm / model.mak模板将包含隐藏的表单。

1 个答案:

答案 0 :(得分:4)

这种方法的想法是:

  1. 客户访问页面。
  2. 服务器呈现表单。
  3. 客户端填写表单并将POST填写到URL。
  4. 服务器呈现一个新页面,其中包含一个隐藏的表单,其中包含刚刚在POST中收到的所有数据。
  5. 客户端POST到URL,确认提交。
  6. 服务器会保留隐藏表单中的数据并重定向。
  7. 现在,根据可用性,您可以自行决定实际需要的URL数量以及Pyramid中的视图数量。您必须考虑无效数据会发生什么?

    请注意,在上面的大纲中,一旦用户将表单POST到URL,该URL必须返回包含隐藏表单的确认页面。如果您尝试将用户重定向到确认页面,则必须以某种方式持久保存数据,无论是在会话中还是通过您在示例中显示的hack(将所有数据推送到GET中) 。第二种解决方案非常糟糕,因为它滥用了HTTP中GET的真正目的。

    还有一个惯例是,每个POST都应该导致重定向,以避免客户端多次提交表单。考虑到这一点,您可以考虑拒绝没有“已确认”标志的POST的简单解决方案,并在提示用户后简单地在javascript中设置“已确认”标志。这使您可以简化表单处理逻辑。

    如果您不想依赖javascript ,您不希望在会话中保留表单数据,那么在第一次POST后会遇到不重定向的问题从上面的大纲来看应该很简单。