2013-06-12 10 views
13

ビュー内にクッキーを設定し、そのビューにテンプレートをレンダリングさせたいとします。私はそれを理解するように、これはクッキーを設定する方法です:テンプレートが含まれていますDjangoでクッキーを設定してからテンプレートをレンダリングする方法は?

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

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

はしかし、私はクッキーを設定し、テンプレート、このような何かをレンダリングしたいですリンクをクリックすると、私が設定しているクッキーをチェックする他のビューが実行されます。上記の2番目の例で示したことを行う正しい方法は何ですか?私は私のテンプレートのすべての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'はレスポンスを返します。レスポンスは、クッキーを設定した同じ変数に代入し、最後に返します。あなたの答えは、 'response = HttpResponse()'行が削除されたのと同等です。 –

+1

私は何か誤解しているかもしれませんが、「テンプレートをレンダリングする前に*クッキーを設定する方法」という質問ではありませんでしたか? – 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

設定されていない。 例:{%if cookie_id%}#表示するリンク数{%endif%} – Manjunath

+0

ありがとうございます。しかし、これは正しく見えません。あなたのコードは、リクエストで 'id'というクッキーを探しています。しかし、そのリクエストが受信されるまでクッキーは設定されていないので、そこには存在しません。 – William

+0

クッキーを作成するテンプレートがレンダリングされたときに、クライアント側でJavaScriptを実行するだけの簡単な方法があると思います。しかし、私はまだ私が上記のことをサーバーサイドで行うことができるかどうかについて興味があります。 – William

1

テンプレートがレンダリングされる前に、受け入れ答えはクッキーを設定します。これは機能します。

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

あなたは自分のテンプレートをレンダリングする際に設定されるクッキーの値が必要な場合は、あなたがこのような何かを試みることができる:

その後、あなたのテンプレートで、あなたのクッキーがあるかどうかに基づいてリンクを表示することができます
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 
関連する問題