在Pyramid中更好地将表单参数传递给隐藏表单的方法
在之前的一个问题中,我在寻找在Pyramid框架中如何在表单之间传递数据的正确方法。根据我得到的回答,我决定使用隐藏表单的方式。
我开始实施这个方法,但我觉得还有更好的方式来传递数据。具体来说,通过网址传递参数会生成一个很难处理的元组。
我希望这个方法足够通用,不需要知道表单具体有哪些参数,同时也要能处理文件字段。
我目前尝试将表单数据传递到确认页面的方法是:
@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 个回答
4
这个方法的思路是这样的:
- 用户访问网页。
- 服务器生成表单。
- 用户填写表单并提交到指定的地址。
- 服务器生成一个新页面,这个页面包含一个隐藏的表单,里面有刚刚收到的所有数据。
- 用户再次提交这个隐藏表单,确认提交。
- 服务器保存隐藏表单中的数据,并进行重定向。
根据用户体验,你可以决定需要多少个不同的地址,以及在Pyramid中需要多少个视图。你还需要考虑,如果数据无效会发生什么?
注意,在上面的步骤中,一旦用户将表单提交到某个地址,这个地址必须返回一个包含隐藏表单的确认页面。如果你试图将用户重定向到确认页面,你就必须以某种方式保存数据,比如在会话中,或者通过你在示例中展示的那种方法(把所有数据放到GET请求中)。第二种方法非常糟糕,因为它滥用了HTTP中GET的真正目的。
还有一个惯例是,每次POST请求都应该重定向,以避免用户多次提交表单。考虑到这一点,你可以简单地拒绝没有“确认”标志的POST请求,并在提示用户后通过JavaScript设置这个“确认”标志。这样可以让你的表单处理逻辑保持简单。
如果你不想依赖JavaScript,并且也不想在会话中保存表单数据,那么在第一次POST之后不进行重定向就会成为一个问题,但除此之外,按照上面的步骤应该是简单的。