作者walelile (wakaka)
看板Python
标题Re: [问题] Django POST部份资料呈现在redirect page
时间Sat Nov 22 06:44:38 2014
※ 引述《uranusjr (←这人是超级笨蛋)》之铭言:
:
: 我可以想到四种做法,都有各自的优缺点:
:
: 1. 直接 POST 到你要跳转的那页
:
: 山不转路转,不要 redirect 问题就没了。HTML form 的 action 参数可以控制
: POST 目标。或者是你乾脆让 POST 的结果就显示使用者资讯就好。反正不要跳转
: 就没事。
:
: 优点:超简单。
: 缺点:如果你有其他状况需要注册後「不」显示这个页面,就会比较麻烦。
: 另外就是使用者无法 refresh 这个页面(因为不是 idempotent)。
:
: 推 walelile: 非常感谢uranusjr大的分析,初次接触,受益良多 11/21 14:32
: → walelile: 我应该会先用GET来做,session我要研究一下怎麽用 11/21 14:40
: 推 Seudo: 为什麽不直接用 render(request, 'profile.html') @@? 11/21 21:11
: → Seudo: profile.html {{request.user.XXXX}} 11/21 21:12
: → walelile: 我从tutorial里面看到说要做redirect来避免重复submit 11/21 22:20
: → uranusjr: @Seudo 注册完又不见得有登入... 11/21 23:14
我原本程式HttpResponseRedirect的流程是
click "reg" link --> GET /accout/reg/ --> Submit --> POST /account/reg/ 302
--> GET /accout/reg_success/ 200
我换上Seudo说的方法後变成
click "reg" link --> GET /accout/reg/ --> Submit --> POST /account/reg/ 200
改变的是POST後,render的页面从reg.html换成reg_success.html。如果refresh这个
页面,FireFox 34.0会显示"必须重新送一次资料才能显示网页,会重做一次所有事情
(如线上购物)",然後把我送回原本GET 看到的 reg.html页面,显示我之前输入过的帐
号和email,但是密码栏位被清空了。我不确定自动清空密码栏位是谁造成的影响= =..
另外一点是,我如果render(request, '/accout/reg_success.html', {'user':user})
会让刚注册完的使用者彷佛已登入,但实际上我换到不同page并没有维持登入的状态。
这问题应该是因为我回传的名字是'user',如果换成'xuser'或只回传'user.username'
就不会有问题。感觉这与uranusjr大所提到的POST的方法类似,只是这是POST到
同一个View但render不同的template。
如果POST到我要跳转的view,
click "reg" -> GET /accout/reg/ -> Submit -> POST /account/reg_success/ 200
有一个问题是,我是在接收到POST後做form.is_valid()的检查,False则回传
render(request, 'user/reg.html', {'reg_form': form })。问题在於,这样做会把
错误的讯息跟原有的表格资料显示在/accout/reg_success/,而非/account/reg/。
且在refresh後会与直接render不同template有同样的状况,
※ 编辑: walelile (61.230.158.213), 11/22/2014 06:47:51
1F:→ pan0438: 试试Form wizard(?) 11/23 16:45