2013-06-12 32 views
13

我想在视图中设置一个cookie,然后让该视图呈现一个模板。据我所知,这是设置cookie的方式:如何在Django中设置cookie然后呈现模板?

def index(request): 
    response = HttpResponse('blah') 
    response.set_cookie('id', 1) 
    return response 

不过,我想设置一个cookie,然后呈现一个模板,像这样:

def index(request, template): 
    response_obj = HttpResponse('blah') 
    response_obj.set_cookie('id', 1) 
    return render_to_response(template, response_obj) # <= Doesn't work 

模板将包含链接,点击后将执行其他视图,检查我设置的cookie。什么是正确的方式来做我在上面的第二个例子中显示的?我明白我可以创建一个包含我的模板的所有HTML的字符串,并将该字符串作为参数传递给HttpResponse,但看起来真的很难看。没有更好的方法来做到这一点?谢谢。

回答

11

这是如何做到这一点:

from django.shortcuts import render 

def home(request, template): 
    response = render(request, template) # django.http.HttpResponse 
    response.set_cookie(key='id', value=1) 
    return response 
+4

你首先实例化一个HttpResponse,但什么也不做。 'render'返回一个响应,您将其分配到相同的变量上,然后在该变量上设置cookie并最终返回。您的答案将与“response = HttpResponse()”行一致。 –

+1

我可能误解了一些东西,但不是“在渲染模板之前如何设置cookie *”的问题? – vmonteco

-1
def index(request, template): 
    response = HttpResponse('blah') 
    response.set_cookie('id', 1) 
    id = request.COOKIES.get('id') 
    return render_to_response(template,{'cookie_id':id}) 
+0

然后在你的模板可以显示基于Cookie的是否是链接是否设置。 例如:{%if cookie_id%}#要显示的链接{%endif%} – Manjunath

+0

感谢您的回复。但是,这看起来不正确。您的代码正在查找请求中名为“id”的cookie。然而,在收到请求之后,cookie才会被设置,所以它不会在那里。 – William

+0

我想一个简单的方法来做到这一点只是在模板呈现的时候在客户端运行一些JavaScript来创建cookie。但是我仍然好奇我是否可以在服务器端完成上面提到的问题。 – William

1

接受的答案设置cookie的模板呈现前。这工作。

response = HttpResponse() 
response.set_cookie("cookie_name", "cookie_value") 
response.write(template.render(context)) 
2

如果你只需要渲染你的模板时要设置的cookie的值,你可以尝试这样的事:

def view(request, template): 
    # Manually set the value you'll use for rendering 
    # (request.COOKIES is just a dictionnary) 
    request.COOKIES['key'] = 'val' 
    # Render the template with the manually set value 
    response = render(request, template) 
    # Actually set the cookie. 
    response.set_cookie('key', 'val') 

    return response 
相关问题