• contextの正体をわかりやすく解説【原則から説明します】

    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のデータが表示されることが確認できました。

    ~Django無料講義~のご案内

    Code for Djangoが、4時間超の無料Django講義をはじめました

    •  ・本を出版したCode for Djangoの
       製作者が作ったサイトです。
    •  ・Code for Djangoの内容も、
       動画で詳しく解説しています。
    •  ・動画は順次ふやしていきますので、
       ただで学び続けることが可能です。
    •  ・Djangoの効率的なスキルアップに、
       是非お役立て下さい。