1/99スタックエンジニアの適当記録

適当なことを書きます。関西で転職したいです。

djangoのcontextについて完全に理解した

タイトルに完全に理解したとか書いてしまいましたが、contextが何者かわかったので、ブログに書きます。

まず、というかいきなり結論になりますが、djangoのcontextを一言でいうと、
「templateに渡す変数」です。
そして、djangoのtemplateは、htmlを生成する仕組みなので、
htmlを生成(レンダリング)するのに利用する変数がcontextです。

わかりにくいかもしれないので、実例を参考にしながらもう少し書いていきます。

例えばですが、このdjangoチュートリアルで以下のようなtemplateがあります。
docs.djangoproject.com

view.pyのindex関数中で使っているcontextのところです。

polls/views.py

def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    template = loader.get_template('polls/index.html')
    context = {
        'latest_question_list': latest_question_list,
    }
    return HttpResponse(template.render(context, request))

ポイントです。
・(3行目) templateにindex.htmlを渡しています。
・(4,5,6行目) contextにlatest_question_listの辞書型の変数を渡しています。
・(7行目) 最終的に、templateにcontextとrequestをrender(レンダリング)してHttpResponseをreturnしています。

つまり、イメージ的には、index.htmlにcontext(変数)とrequest(http)を混ぜて、返しているわけです。

以上をイメージしながら、チュートリアルに書いてあるcontextの定義を読んでみます。

このコードは、 polls/index.html というテンプレートをロードし、そこにコンテキストを渡します。
コンテキストは、テンプレート変数名を Python オブジェクトにマッピングする辞書です。

なんとなくわかったのではないでしょうか。

チュートリアルにも書かれていますが、djangoではこのhtmlに変数を渡して、それをhttpresponseオブジェクトを返すというイディオムはよく使われるので、render()という関数が用意されています。
単純に考えても、よく発生しそうな内容です。
ユーザがアクセスして、アクセスした内容によって、ページ描画内容を変化させます。
流れはこんな感じでしょうか
1. ユーザがサイトにアクセスします(httprequest)
2. 変数(context)が生成されます
3. 変数ともともと用意されているtemplate(htmlやcss)を合わせて、ページを生成します
4. ユーザにhttpを返します(httpresponse)

このような流れがよく発生するため、よりシンプルにコードが書けるrender関数が用意されているというわけです。

from django.shortcuts import render
def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    context = {'latest_question_list': latest_question_list}
    return render(request, 'polls/index.html', context)

すっきりしてわかりやすくなりました。
・(4行目) contextを定義します。
・(5行目) httpとhtmlと変数を合わせてretrunします

チュートリアルにrenderの使い方も書かれています。

render() 関数は、第1引数として request オブジェクトを、第2引数としてテンプレート名を、第3引数(任意)として辞書を受け取ります。
この関数はテンプレートを指定のコンテキストでレンダリングし、その HttpResponse オブジェクトを返します。

さて、だいぶ理解が深まったところで、もっかい主題のcontextについて書いておきます。
contextとは「htmlをレンダリングするときに渡す辞書型変数」です。