Django会话期间Session变量无法更新问题求助
原POST请求方案的问题分析
1. 表单重复action属性导致请求方式错误
原HTML表单存在重复属性的错误:
<form action="{% url 'watchlist_del' item.id %}" action="post">
HTML规范不允许同一元素拥有重复属性,浏览器会直接忽略第二个action属性。而表单默认的请求方式是GET,所以点击「Delete」按钮时,实际发送的是GET请求,完全不会触发视图里if request.method == "POST"的代码分支,删除逻辑根本没执行,session自然不会更新。
2. 缺少CSRF令牌(即使请求方式修正也会失败)
Django默认开启CSRF防护机制,所有POST请求必须携带CSRF令牌才能通过验证。原表单没有添加{% csrf_token %}标签,就算你把表单的请求方式改对(比如写成method="post"),也会返回403 Forbidden错误,无法执行后续的删除操作。
3. 补充:session更新的潜在注意点
就算上述表单问题全部修复,直接修改request.session["watchlist"]这类嵌套可迭代对象时,Django有时无法自动检测到session的修改,需要手动添加:
request.session.modified = True
不过这不是你本次问题的核心原因,核心还是请求方式没触发到POST分支。
为什么改用<a>标签能生效?
改用<a>标签后,发送的是GET请求,而修改后的视图直接通过item_id is not None判断执行删除逻辑,不再限制请求方式,所以能正常触发删除操作、更新session,页面刷新后就能看到实时变化。
内容的提问来源于stack exchange,提问作者Bhashwar Sengupta
相关产品推荐
相关产品推荐

