2013-06-12 31 views
13

Tôi muốn đặt cookie bên trong chế độ xem và sau đó có chế độ xem đó hiển thị mẫu. Theo tôi được biết, đây là cách để thiết lập một cookie:Làm thế nào để thiết lập cookie trong Django và sau đó làm mẫu?

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

Tuy nhiên, tôi muốn thiết lập một cookie và sau đó làm cho một mẫu, một cái gì đó như thế này:

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

Mẫu sẽ chứa liên kết, khi được nhấp vào sẽ thực hiện các chế độ xem khác kiểm tra cookie tôi đang thiết lập. Cách chính xác để làm những gì tôi đã thể hiện trong ví dụ thứ hai ở trên là gì? Tôi hiểu rằng tôi có thể tạo một chuỗi chứa tất cả HTML cho mẫu của tôi và chuyển chuỗi đó làm đối số cho HttpResponse nhưng điều đó có vẻ thực sự xấu. Không có cách nào tốt hơn để làm điều này? Cảm ơn.

Trả lời

11

Đây là cách để làm điều đó:

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

Bạn khởi tạo một HttpResponse đầu tiên nhưng không làm gì với nó. 'render' trả về một phản hồi, mà bạn gán vào cùng một biến mà sau đó bạn đặt cookie và cuối cùng bạn quay trở lại. Câu trả lời của bạn sẽ tương đương với dòng 'response = HttpResponse()' bị loại bỏ. –

+1

Tôi có thể đã hiểu nhầm điều gì đó, nhưng không phải là câu hỏi "cách đặt cookie * trước * hiển thị mẫu"? – 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

Sau đó, trong mẫu của bạn, bạn có thể hiển thị các liên kết dựa trên việc cookie của bạn là đặt hay không. Ví dụ: {% if cookie_id%} #links được hiển thị {% endif%} – Manjunath

+0

Cảm ơn bạn đã trả lời. Tuy nhiên, điều này không đúng. Mã của bạn đang tìm kiếm một cookie có tên là 'id' trong yêu cầu. Tuy nhiên, cookie không được đặt cho đến sau khi nhận được yêu cầu đó nên nó sẽ không có ở đó. – William

+0

Tôi đoán một cách đơn giản để làm điều đó là chỉ chạy một số JavaScript ở phía máy khách khi mẫu được hiển thị tạo cookie. Nhưng tôi vẫn tò mò về việc liệu những gì tôi hỏi ở trên có thể được thực hiện phía máy chủ hay không. – William

1

Câu trả lời được chấp nhận đặt cookie trước khi mẫu được trả lại. Những công việc này.

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

Nếu bạn chỉ cần giá trị cookie được thiết lập khi vẽ mẫu của bạn, bạn có thể thử một cái gì đó như thế này:

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