在之前的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模板将包含隐藏的表单。
答案 0 :(得分:4)
这种方法的想法是:
现在,根据可用性,您可以自行决定实际需要的URL数量以及Pyramid中的视图数量。您必须考虑无效数据会发生什么?
请注意,在上面的大纲中,一旦用户将表单POST到URL,该URL必须返回包含隐藏表单的确认页面。如果您尝试将用户重定向到确认页面,则必须以某种方式持久保存数据,无论是在会话中还是通过您在示例中显示的hack(将所有数据推送到GET中) 。第二种解决方案非常糟糕,因为它滥用了HTTP中GET的真正目的。
还有一个惯例是,每个POST都应该导致重定向,以避免客户端多次提交表单。考虑到这一点,您可以考虑拒绝没有“已确认”标志的POST的简单解决方案,并在提示用户后简单地在javascript中设置“已确认”标志。这使您可以简化表单处理逻辑。
如果您不想依赖javascript 和,您不希望在会话中保留表单数据,那么在第一次POST后会遇到不重定向的问题从上面的大纲来看应该很简单。