我真的需要SESSION_SAVE_EVERY_REQUEST = True

时间:2016-03-29 17:58:23

标签: python django session

背景信息:在我的模板中,我点击“添加产品”,它会转到另一个模板,其中我有一个所有产品的列表,我选择一个,它会将我带回到我选择的产品列表模板,并且我保留添加等等。

在我的接收器视图中,我有这个:

def vw_Sell(request):
    if request.POST:
    POST_received = request.POST

    if 'ses_productList' in request.session:
        request.session['ses_productList'].append({
            'product': POST_received['idProduct'],
            'quant': POST_received['quantity'],
        })
    else:
        request.session['ses_productList'] = []

    producList = request.session['ses_productList']
else:
    if 'ses_productList' in request.session:
        producList = request.session['ses_productList']
    else:
        producList = {}

context = {
    "selected_products": producList
}

return render(request, "shop.html", context)

它只将第一个产品保存到会话字典中。我研究并找到SESSION_SAVE_EVERY_REQUEST并将其设置为True,然后它可以工作,但我担心我是否正确的方式,谢谢!

2 个答案:

答案 0 :(得分:2)

如果会话的modified属性为True,则会自动保存。每次调用会话对象的__setitem__()方法(通常通过=运算符)时,都会设置该属性。

这是Django code for it

但是,您要附加到已存在的列表,因此会话对象永远不会知道有任何更改。要保存会话,您需要手动设置其modified属性

request.session.modified = True

将会话标记为“脏”并让会话的中间件保存它。

session Middleware code

答案 1 :(得分:0)

感谢@ C14L的最终代码:

if 'ses_productList' in request.session:
        request.session['ses_productList'].append({
            'product': POST_received['idProduct'],
            'quant': POST_received['quantity'],
        })
request.session.modified = True