Django URLパラメータをセッションに保存してテンプレートで利用する

HTTPプロトコルにおいてURLでパラメータを受け渡してページ間で利用する場合、セッション機能を利用するのが最もポピュラーな方法ではないでしょうか。

Djangoではデフォルトでセッション機能が含まれていて簡単に扱えます。今回はURLからパラメータを取得しセッションに保存してから、別ページでそのパラメータをセッションから取り出しテンプレートに渡すやり方を説明します。

イタリック体は各自修正ください。

 

settings.py
MIDDLEWARE = [
  'django.contrib.sessions.middleware.SessionMiddleware',  # セッション機能の有効化
]

INSTALLED_APPS = [
  'django.contrib.sessions',  # セッションDBを使う設定
]

セッション管理にデータベースを使う場合、上記のようにsettings.pyに書いてmigrateするとSESSIONテーブルが自動で作成されます。なおデフォルトでセッションDBを使う設定になっています。
他にキャッシュやファイルを使ってのセッション管理も出来きます。

 

urls.py
from django.urls import path

urlpatterns = [
  path('<int:parameter>', MyView1.as_view(), name='test'),
]

URLからパラメータを取得するため、urls.pyのURLパターンを上記にように書きます(Django2.0以降の書き方です)。この例では’http://example.com/1234’のようなURLでアクセスがあった場合、’1234’部分を’parameter’という名前で変数に格納しています。

 

MyView1.py
from django.views.generic import TemplateView

class MyView1(TemplateView):
  template_name = "my_template1.html"

  def get(self, request, *args, **kwargs):
    parameter = self.kwargs.get('parameter')  # urls.pyでparameterに格納した値を取り出す。
    if parameter:
      request.session['parameter'] =parameter  # セッションに'parameter'という名前のキーで保存する。

    return super().get(request, *args, **kwargs)

上記のURLパターンで呼び出されるViewです。URLから取り出したパラメータ値をセッションに保存しています。

 

MyView2.py
from django.views.generic import TemplateView

class MyView2(TemplateView):
  template_name = "my_template2.html"

  def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    parameter = self.request.session.pop('parameter', None)  # セッションからキー'parameter'の値を取り出す。
    if parameter:
      context['parameter'] =parameter  # テンプレートに値を渡すためコンテキストに保存する。
  
 return context

セッションに保存していたデータは他のView上で上記のように取り出し可能です。取り出した値はコンテキストに保存して、テンプレート上で{{ parameter }}のように書いてそのまま表示することも出来ます。

sponsor