首页 > 解决方案 > 使用 AJAX 时 Django 会话变量不起作用

问题描述

我必须删除一个项目,为此,用户单击页面中的某个“删除”按钮,Javascript 发出 AJAX 请求(包括请求标头中的 CSRF 令牌),以便 Django 视图继续删除. 我的 Django 视图正在正确处理请求并删除该项目。但是,在同样的观点中,我做了以下事情:

  1. 删除项目
  2. 在 request.session['message'] 上放一条消息
  3. 重定向到“列表页面”

“列表页面”视图检查 request.session 中是否有一些“消息”并将其返回到页面以向用户显示一些警报

但是,在使用 AJAX 时,这种机制不适用于这种情况。这就像“删除”视图会话和“列表页面”会话都不相同,因为它在 request.session 中找不到“消息”。

以下是一些涉及的文件。

urls.py

...

urlpatterns = [
        path('agenda', views.agenda, name='agenda'),
        path('<int:reuniao_id>/excluirReuniao', views.excluirReuniao, name='excluirReuniao'),
]

视图.py

def agenda(request):
    reunioes = ReuniaoEmpresa.objects.all()

    if 'message' in request.session:
        message= request.session['message']
        del request.session['message']
    else:
        message= ''

    context = {
        'reunioes' : reunioes,
        'message' : message
    }

    return render(request, 'agenda/agenda.html', context)


def excluirReuniao(request, reuniao_id):
    reuniao = get_object_or_404(ReuniaoEmpresa, pk=reuniao_id)    
    reuniao.delete()

    request.session['message'] = 'Reunião excluída com sucesso!'

    return redirect(reverse("agenda:agenda"))

来自删除页面的 AJAX 请求

let token = '{{csrf_token}}';

$.ajax({
    type: 'POST',
    headers: { "X-CSRFToken": token },
    url: "{% url 'agenda:excluirReuniao' idReuniao %}",
    timeout: 7200000,
    success: function (xhr, textStatus) {
        ...
    },
    error: function (xhr, textStatus, errorThrown) {
        ...
    }
});

议程.html

<html>
   ... (all the HTML stuff)
</html>
<script>
    var message= "{{message}}";  // gets the message from the context        

    $(document).ready(function () {
        // uses jquery-confirm to show the message to the user as an alert

        if (message!= '') {
            $.alert({
                title: 'Concluído',
                content: message,
                type: 'green'
         });
    }
    
});
</script>

例如,如果第一次调用不是通过 AJAX 而是通过 POST 表单完成的,这种机制就可以很好地工作。

标签: jquerydjangoajaxsessiondjango-sessions

解决方案


推荐阅读