2013-06-12 23 views
13

Chcę ustawić plik cookie wewnątrz widoku, a następnie wyświetlić ten widok jako szablon. Jak rozumiem, jest to sposób, aby ustawić ciasteczko:Jak ustawić plik cookie w Django, a następnie wyświetlić szablon?

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

Jednakże chcę ustawić plik cookie i następnie renderować szablon, coś takiego:

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

Szablon będzie zawierał linki, które po kliknięciu wykonają inne widoki, które sprawdzają plik cookie, który ustawiam. Jaki jest właściwy sposób robienia tego, co pokazałem w drugim przykładzie powyżej? Rozumiem, że mogę utworzyć ciąg zawierający cały kod HTML dla mojego szablonu i przekazać ten ciąg jako argument do HttpResponse, ale wydaje się to naprawdę brzydkie. Czy nie ma lepszego sposobu na zrobienie tego? Dzięki.

Odpowiedz

11

To jak to zrobić:

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

Najpierw wykonaj instancję HttpResponse, ale nic z nią nie rób. 'render' zwraca odpowiedź, którą przypisujesz do tej samej zmiennej, na której ustawiasz plik cookie, a który ostatecznie zwrócisz. Twoja odpowiedź byłaby równoważna z linią 'response = HttpResponse()' removed. –

+1

Mogłem coś źle zinterpretować, ale nie było pytanie "jak ustawić ciasteczko * przed * renderowaniem szablonu"? – 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

Następnie w szablonie można pokazać powiązania oparte na czy ciasteczko jest ustawić lub nie. Np .: {% if cookie_id%} # linki do wyświetlenia {% endif%} – Manjunath

+0

Dziękujemy za odpowiedź. Jednak to nie wygląda dobrze. Twój kod szuka w żądaniu pliku cookie o nazwie "identyfikator". Jednak plik cookie nie jest ustawiany do momentu otrzymania tego żądania, więc nie będzie go tam. – William

+0

Myślę, że jednym prostym sposobem na zrobienie tego byłoby po prostu uruchomienie JavaScript po stronie klienta po wyrenderowaniu szablonu, który tworzy plik cookie. Ale nadal jestem ciekawy, czy to, o co pytam, można zrobić po stronie serwera. – William

1

Zaakceptowanych odpowiedź ustawia cookie przed szablon jest renderowane. To działa.

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

Jeśli wystarczy wartość cookie można ustawić podczas renderowania szablonu, można spróbować czegoś takiego:

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 
Powiązane problemy