2015-02-09 93 views
0

我有一个强制执行严格页面顺序的应用程序。如果用户单击后退按钮,应用程序将检测到乱序页面访问并将用户返回到开始位置。如何渲染带有瞬态变量的Django模板?

我想通过将用户重定向到正确的页面并显示弹出式JavaScript警告框告诉他们不要使用“后退”按钮,使其更友好一些。

我已经使用了一个函数,它执行了很多有效性检查,如果请求没问题,它会返回None,或者如果请求无效,则返回HttpResponseRedirect到另一个页面(通常是错误页面或登录页面)。我所有的意见都在上面这段代码:

response = validate(request) 
if response: 
    return response 

所以,既然我有这个的validate()函数已经,这似乎是一个好地方,添加此额外的代码检测出序访问。

但是,由于无序检测标志必须在重定向中生存,我不能只设置一个视图变量;我必须在会话数据中设置标志。但我当然不希望永久性地在会话数据中设置标志;我想在处理模板后从会话数据中删除标志。

我可以添加如下代码到我所有的渲染电话:

back_button = request.session.get('back_button', False) 
response = render(request, 'foo.html', { 'back_button': back_button }) 
if back_button: 
    del request.session['back_button'] 
return response 

但这似乎有点凌乱。有没有办法在处理模板后自动删除会话密钥?也许是一件中间件?

我使用基于功能的视图,而不是基于类,顺便说一句。

回答

1

会话对象使用字典界面,让您可以使用pop代替get检索和删除在同一时间的关键是:这比我的例子更紧凑

back_button = request.session.pop('back_button', False) 
+0

,谢谢。但是我可以在哪里放置它,以便自动调用它,而不必将它添加到每个视图的底部? – 2015-02-09 23:09:09

+0

这听起来像是[context processor]的理想用法(https://docs.djangoproject.com/en/1.7/ref/templates/api/#subclassing-context-requestcontext)。 – 2015-02-09 23:14:14