Django模板会话未更新值

时间:2017-10-16 15:07:36

标签: python django django-templates

我正在开发django中的人类与人类象棋应用程序。典当促销的部分不起作用。会话值正在更改,但未更新为django模板。

推广视图

def promote(request):
    #Update board with promoted piece
    board = request.session['board']
    target = request.session['promote_target']
    board[target[0]][target[1]] = request.POST['piece']
    request.session['board'] = board
    request.session['promotion'] = False
    request.session['player'] = 1

    return render(request,'chess_app/Default.htm')

js调用服务器的函数

function promotion(piece){
        //Function to promote pawns
        //Add a confirm message
        $.ajax({url:"{%url 'promote'%}",data:{'piece':piece},type:'post',success:function(){location.reload()}});
        }

一切正常,但会话没有得到更新 如果你可以帮忙的话会很棒。

2 个答案:

答案 0 :(得分:0)

选中此question我想它应该可以解决您的问题。 但是IMHO在模板中使用会话不是很好的解决方案,请检查这个替代选项:

Middleware

您可以从会话中获取值并将其设置在中间件中的请求对象中。如果您计划在不同视图和不同模板中使用此值,则此选项是明智的。

View context

您可以在视图上下文中放置值。如果您计划仅在一个视图中使用值,则此选项将很好。 (当然,您可以创建mixin以在不同视图之间共享此功能

Inclusion tags

如果您可以提取使用此数据的模板的一部分,您可以为此模板创建自定义标记,并从请求中获取所有必需的数据。

Context processor

如果您需要在所有模板之间共享此值,则可以使用上下文处理器。

答案 1 :(得分:0)

我不确定为什么像一年前被问到后,为什么不将其发布在此线程中。

The session values are changing, but not getting updated to django template.

要解决此问题,您只需告诉Django会话已被修改,然后就知道可以在模板中对其进行更新:

# make Django update sessions in templates
request.session.modified = True

以下是文档:

https://docs.djangoproject.com/en/2.2/topics/http/sessions/#when-sessions-are-saved

因此,将其放在上下文中:

def promote(request):
    #Update board with promoted piece
    board = request.session['board']
    target = request.session['promote_target']
    board[target[0]][target[1]] = request.POST['piece']
    request.session['board'] = board
    request.session['promotion'] = False
    request.session['player'] = 1

    # make Django update sessions in templates
    request.session.modified = True

    return render(request,'chess_app/Default.htm') # you are good