【问题标题】:How to render a Django template with a transient variable?如何使用瞬态变量渲染 Django 模板?
【发布时间】:2015-04-09 18:36:12
【问题描述】:

我有一个应用程序强制执行严格的页面顺序。如果用户单击“后退”按钮,应用程序会检测到无序页面访问并将用户返回到开始。

我想让这更友好一点,通过将用户重定向回正确的页面并显示一个弹出的 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

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

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

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    会话对象使用字典接口,所以可以使用pop代替get同时检索和删除key:

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

    【讨论】:

    • 这比我的例子更紧凑,谢谢。但是我可以把它放在哪里让它自动调用,而不是必须将它添加到每个视图的底部?
    • 这听起来像是context processor 的理想用途。
    猜你喜欢
    • 2016-05-22
    • 2018-06-23
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2016-06-06
    • 2014-01-25
    • 1970-01-01
    • 2017-10-13
    相关资源
    最近更新 更多