2013-06-12 8 views
13

Desidero impostare un cookie all'interno di una vista e quindi fare in modo che la visualizzazione renda un modello. A quanto mi risulta, questo è il modo di impostare un cookie:Come impostare i cookie in Django e quindi renderizzare il modello?

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

Tuttavia, voglio impostare un cookie e quindi rendere un template, qualcosa di simile:

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

Il modello conterrà collegamenti che, se cliccati, eseguiranno altre viste che controllano il cookie che sto impostando. Qual è il modo corretto di fare ciò che ho mostrato nel secondo esempio sopra? Capisco che potrei creare una stringa che contenga tutto l'HTML per il mio modello e passare quella stringa come argomento a HttpResponse ma che sembra davvero brutta. Non c'è un modo migliore per farlo? Grazie.

risposta

11

Questo è come farlo:

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

Prima istanzia un HttpResponse ma non fai nulla con esso. 'render' restituisce una risposta, che tu assegni nella stessa variabile su cui poi imposti il ​​cookie e che alla fine ritorni. La tua risposta sarebbe equivalente alla riga 'response = HttpResponse()' rimossa. –

+1

Forse ho frainteso qualcosa, ma non era la domanda "come impostare un cookie * prima di * renderizzare il modello"? – 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

Poi, nel tuo modello è possibile mostrare i link a seconda che il cookie è impostato o no. Es: {% se cookie_id%} #links da visualizzare {% endif%} – Manjunath

+0

Grazie per la risposta. Tuttavia, questo non sembra giusto. Il tuo codice cerca un cookie chiamato 'id' nella richiesta. Tuttavia, il cookie non viene impostato fino a dopo che tale richiesta è stata ricevuta, quindi non sarà lì. – William

+0

Immagino che un modo semplice per farlo sarebbe solo quello di eseguire alcuni JavaScript sul lato client quando il modello è reso che crea il cookie. Ma sono ancora curioso di sapere se quello che sto chiedendo sopra può essere fatto lato server. – William

1

La risposta accettata imposta il cookie prima che il modello è reso. Questo funziona.

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

Se avete solo bisogno il valore del cookie da impostare durante il rendering il modello, si potrebbe provare qualcosa di simile:

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 
Problemi correlati