2013-06-12 7 views
13

Ich möchte einen Cookie in einer Ansicht festlegen und dann eine Vorlage in dieser Ansicht rendern. Wie ich es verstehe, ist dies der Weg, einen Cookie zu setzen:Wie setze ich einen Cookie in Django und rendere dann die Vorlage?

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

Allerdings mag ich ein Cookie setzen und dann eine Vorlage machen, so etwas wie diese:

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

Die Vorlage enthält Links, die, wenn sie angeklickt werden, andere Ansichten ausführen, die nach dem Cookie suchen, den ich einstelle. Was ist der richtige Weg, um das zu tun, was ich im zweiten Beispiel gezeigt habe? Ich verstehe, dass ich eine Zeichenfolge erstellen konnte, die den gesamten HTML-Code für meine Vorlage enthält, und diese Zeichenfolge als Argument an HttpResponse übergeben, aber das scheint wirklich hässlich zu sein. Gibt es dafür keinen besseren Weg? Vielen Dank.

Antwort

11

Dies ist, wie es geht:

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

Sie instanziieren Sie zuerst eine HttpResponse, aber nichts damit zu tun. 'render' gibt eine Antwort zurück, die Sie der gleichen Variablen zuweisen, auf die Sie dann das Cookie setzen und die Sie schließlich zurückgeben. Ihre Antwort wäre äquivalent mit der entfernten Zeile 'response = HttpResponse() '. –

+1

Ich habe vielleicht etwas missverstanden, aber war nicht die Frage "Wie setze ich einen Cookie * vor * Rendering der Vorlage"? – 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

Dann in Ihrer Vorlage, die Sie über die Links basierend auf zeigen können, ob Ihr Cookie ist eingestellt oder nicht. Beispiel: {% if cookie_id%} # anzuzeigende Links {% endif%} – Manjunath

+0

Vielen Dank für Ihre Antwort. Das sieht jedoch nicht richtig aus. Ihr Code sucht nach einem Cookie namens "id" in der Anfrage. Der Cookie wird jedoch erst gesetzt, nachdem diese Anfrage empfangen wurde, so dass sie nicht mehr da ist. – William

+0

Ich denke, eine einfache Möglichkeit wäre, nur etwas JavaScript auf der Clientseite auszuführen, wenn die Vorlage gerendert wird, die den Cookie erstellt. Aber ich bin immer noch neugierig, ob das, was ich oben gefragt habe, serverseitig gemacht werden kann. – William

1

Die akzeptierte Antwort setzt das Cookie, bevor die Vorlage gerendert wird. Das funktioniert.

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

Wenn Sie nur den Cookie-Wert müssen eingestellt werden, wenn die Vorlage Rendering, Sie so etwas wie dies versuchen könnten:

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 
Verwandte Themen