2013-06-12 63 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 
相關問題