djangoを使っていると、一度はcontextという言葉を見たことがあるのではないかと思います。
ただ、このcontextは一体何なのか、そしてどうやって使いこなせば良いのかわからないという方も多いのではないかと思います。
そこで今回は、contextの正体についてわかりやすく解説していきます。
contextは辞書型のデータである
まず、contextは辞書型のデータであるということを押さえておきましょう。
なお、辞書型についてよくわからないという方は、辞書型という記事を参考にしてください。
context(データ)が取得される仕組み
次に、contextが取得される仕組みについて理解していきましょう。
ちなみに、contextが自動的に取得されるのはclass based viewの場合です(function based viewの場合は自動的に取得されません)。
contextは、get_context_data()メソッドによって取得されます。
つまり、このメソッドを使うことによって、contextという変数にデータが入るのです。
では、get_context_data()メソッドが呼ばれるタイミングは?
そうすると、get_context_dataメソッドがいつ呼ばれるのでしょうか?
これは、as_view()メソッドが呼ばれたタイミングで実行されます。
もう少し具体的な例でみていきましょう。
urls.pyファイルの中で、このようなurlpatternがあったとしましょう。
コードurlpatterns = [
path('', SampleView.as_view(), name='sample')
]
これは、SampleViewクラスのas_viewメソッドを実行しています。
そして、as_viewメソッドが実行されると、それに続いて多くのメソッドが実行されるのですが、その中の一つのメソッドがget_context_dataなのです。
get_context_dataメソッドの実行で取れるデータは?
では、get_context_dataメソッドを使うことによってどのようなデータが取れるのでしょうか?
contextを表示するコードを書いていきます。
コードclass SampleView(ListView):
template_name = 'list.html'
model = SampleModel
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
print(context)
return context
get_context_dataメソッド(太字部分)に注目してください。
ここでは、継承先のListViewのget_context_dataメソッドを実行し、それをcontext変数に代入しています。
そして、次の行でcontextをprint関数で出力しています。
これで、get_context_dataでどういったデータが取得できるのか確認できるようになります。
実際にコンソールで確認してみましょう。
(なお、SampleModelに2つのデータを作成しています。)
コマンドライン{'paginator': None,
'page_obj': None,
'is_paginated': False,
'object_list': <QuerySet [<AppModel: データ1つ目>, <AppModel: データ2つ目>]>,
'appmodel_list': <QuerySet [<AppModel: データ1つ目>, <AppModel: データ2つ目>]>,
'view': <app.views.AppListView object at 0x7f1fc52d3940>}
まず、これがkey-valueペアで作られている辞書型のデータであることを確認しましょう。
contextの中身を確認
ここから、contextの中身を確認していきましょう。
なお、get_context_dataで取れるデータはViewの種類によって異なります。
今回はListViewの場合に取れるデータを表示していることに注意してください。
1. pagination関係
まずはpagination関係です。'pagenator'、'page_obj'、'is_paginated'の3つがpaginationに関係します。
paginationはサイト内のページ(記事を10ずつ表示する場合など)の設定をした場合に使われます。
詳しくは、ページネーションの作り方を分かりやすく解説という記事を参考にしてください。
2. Queryset関連
次はQueryset関連です。Querysetはモデルに入っているデータを並べて格納したものです。
また、object_listという変数と、samplemodel_listという二つの種類があることも注目しましょう。
(ListViewは、object_listという統一した名前でquerysetを使い回せるようにしているため、重複しているようなデータが存在しています。)
Querysetについて詳しく知りたい方は、querysetについて分かりやすく解説という記事を参考にして下さい。
3. View関連
最後はView関連です。
Viewは、ブラウザに表示するhtmlファイルの情報が入っています。
SampleViewの中でtemplate_name='list.html'と書いたことを覚えているでしょうか?
contextの'view'にはこのtemplate_nameの情報が入っています。
4. データの追加
contextは辞書型のデータですので、データを追加することもできます。
例えば、context['weather'] = '晴れ'とすれば、keyがweather、valueが晴れというデータを追加することができます。
htmlファイルに表示する方法
最後に、contextをhtmlファイルに表示する方法を見ていきましょう。
結論としては、{{ }}で囲むことによって表示することが可能です。
具体的なコードでみていきましょう。
コードlist.html
{% for item in object_list %}
{{ item }}
{% end for %}
{{ weather }}
アウトプットデータ1つ目 データ2つ目
晴れ
このように、ブラウザでcontextのデータが表示されることが確認できました。