在Django模板中使用后如何删除会话变量

时间:2019-06-02 11:14:40

标签: python django templates session

def demo(request):
    if data:
        request.session['success'] = "Success'
    else:
        request.session['failed'] = "Failed'

在这里,我定义了一种方法,如果我有数据,则存储成功的会话,否则将失败。

此后,我用户重定向到另一个页面,然后在模板中显示此会话变量。

但是在显示此会话状态之后,我想删除该会话变量。因为我只想向用户仅一次显示此消息。如果用户刷新页面,则该变量应删除

我试图在网上查找,但没有得到任何帮助。所以请帮我。

谢谢

PS:我正在使用return redirect('page')将用户重定向到另一个页面。使用return render(request, "my_tmp.html")渲染另一个模板不起作用,因为这只会在当前url中加载模板(URL不会改变,只有内容会改变)。所以我不想要那个。我知道我可以通过在上下文中传递会话变量来使用这种方式,但这不是我想要的。

我正在使用Django 2

1 个答案:

答案 0 :(得分:2)

不要为此使用会话变量。顾名思义,应该将会话变量用于通常具有与会话相同的生存期的变量。自己执行此操作还将导致大量编码,特殊情况,并且很容易出错。

Django具有向用户显示消息的工具:messages framework [Django-doc]。该文档指定了如何设置此框架,尽管默认情况下已经安装了该框架(因此,如果不删除它,则不需要做很多事情)。

在您看来,然后可以添加消息,例如:

from django.contrib import messages

def demo(request):
    if data:
        messages.success(request, 'Operation successful')
    else:
        messages.error(request, 'Operation failed!')
    return render(request, 'some_template.html', {})

然后,您可以在模板中呈现documentation [Django-doc]中指定的消息:

{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
</ul>
{% endif %}

例如,您可以将其包含在base.html中(从而扩展该超级模板中的所有其他页面),以便在所有页面上呈现消息。

一旦呈现,Django将自动清除消息。因此,您无需自己进行簿记。