SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine(コードジン) DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Djangoチュートリアル

Djangoチュートリアル(後編)

Python対応のWebアプリケーションフレームワーク


HTTPセッションの使用

 次にWebアプリケーションでは必須の機能となるセッション機能を使用してみましょう。ECサイトに買い物かご機能を付加して複数の商品を購入できるように機能を追加します。

セッションの有効化

 まずはDjangoのプロジェクトでセッション機能用のミドルウェア(django.contrib.sessions.SessionMiddleware)とアプリケーション(django.contrib.sessions)を有効化するための設定をsettings.py(リスト14)に記述する必要があります。この設定はデフォルトで有効になっていますので、特に編集する必要はありません。

[リスト14]settings.py
MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
)
~省略
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    ~省略
)

買い物かごの実装

商品ページの修正

 買い物かごの機能は商品ページの「買い物かごに入れる」ボタンを押下すると、セッション情報に、購入商品情報(商品、購入数、価格など)を格納し、買い物かごの中身を画面に表示するという機能とします。

 まずは商品ページに買い物かごに遷移するための機能を追加するためテンプレートを修正します。リスト15のようにテンプレートを修正してください(太字の箇所を追加しています)。formを追加し、商品の購入個数とitem_id(hidden)を送信できるようにしています。図12が修正後の画面イメージです。

[リスト15]item.html(商品ページ)
<html>
~省略
商品コード:{{ item.item_code }}<br>
商品名:{{ item.item_name }}<br>
価格:{{ item.price }}円<br>
<br>
<form action="/cart" method="POST">
購入個数:<input type="text" name="buy_num" value="1"><br>
<br>
<input type="submit" value="買い物かごに入れる">
<input type="hidden" name="item_id" value="{{ item.id }}">
</form>
~省略
</html>
図12 商品ページへの購入個数入力欄追加
図12 商品ページへの購入個数入力欄追加

買い物かご用ビュー関数の実装

 買い物かごの機能を実現するためのビュー関数は、アプリケーションフォルダのview.pyのdo_cartビュー関数に記述します。購入情報は、セッションにリスト形式で保存します。まずは、リストに格納する購入情報を格納するクラスをリスト16に示します。

[リスト16]cart.py(商品購入情報格納用クラス)
# -*- coding: utf-8 -*-

class CartItem:
    item_id = 0
    item_code = None
    item_name = None
    price = 0
    buy_num =0

 次に、買い物かご情報を操作するビュー関数(do_cart)をリスト17に示します。

[リスト17]views.py(買い物かご制御用ビュー関数)
def do_cart(request):

    # hiddenのitem_idを取得しintに型変換
    item_id = int(request.POST['item_id'])
    item = Item.objects.get(id=item_id)

    # DBからItem情報を取得する。
    cart_item_list = request.session.get('cart_item_list',[])
    ci = CartItem()
    ci.item_id = item_id
    ci.item_code = item.item_code
    ci.item_name = item.item_name
    ci.price = item.price
    ci.buy_num = request.POST['buy_num']
    cart_item_list.append(ci)
    request.session['cart_item_list'] = cart_item_list

    return direct_to_template(request,'page/cart_item_list.html',
        extra_context={
            'cart_item_list': cart_item_list,
        }
    )

 POSTされたデータを取得し、データ処理をする際には、前掲したFormクラスを使用するのが通常ですが、ここではサンプルの簡略化を図るため、request.POSTから取得した値をint変換する方法を採用しました。

買い物かご中身表示用テンプレートの定義

 ビュー関数で制御されている買い物かご情報を表示するテンプレートがcart_item_list.htmlです。リスト18にテンプレートの内容を示します。

[リスト18]cart_item_list.html(買い物かご制御用ビュー関数)
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   <title>買い物かご</title>
<head>
<body>
<center>買い物かごの中身は次のとおりです。<br>
<table border="1">
   <tr><th>商品コード</th><th>商品名</th><th>価格</th><th>購入個数</th></tr>
{% for cart_item in cart_item_list %}
   <tr>
      <td>{{ cart_item.item_code }}</td>
      <td>{{ cart_item.item_name }}</td>
      <td>{{ cart_item.price }}円</td>
      <td>{{ cart_item.buy_num }}個</td>
   </tr>
{% endfor %}
</table>
</center>
</body>
</html>

urls.pyの定義

 最後にdo_cartビュー関数とURLをマッピングをurls.pyファイルに設定します(リスト19)。

[リスト19]urls.py(買い物かご制御用ビュー関数とURLのマッピング)
urlpatterns = patterns('',
    ~省略
    (r'^cart', 'ecsite.itempage.views.do_cart'),
)

買い物かご機能の実行

 それでは商品ページ「http://localhost:8000/item/1」にアクセスし「買い物かごに入れる」ボタンを押下してください。買い物かごの情報が表示されます。ブラウザの戻るボタンで戻り、購入個数を「2」を入力し「買い物かごに入れる」ボタンを再び押下してください。図13のように、前回「買い物かごに入れる」ボタンを押下した際の情報も一緒に表示されるはずです。これで前回分の情報がセッションに保存されていることが確認できました。

図13 買い物かご画面の表示
図13 買い物かご画面の表示

セッション情報の保存ストレージについて

 Djangoではセッション情報の保存先をいくつか用意しています。以下の表にセッション情報の保存先をまとめました。

セッション情報の保存先一覧
セッション保存先 設定 説明
データベース SESSION_ENGINE=
'django.contrib.sessions.backends.db'
DBにセッション情報を保存する。Djangoのデフォルト設定
ファイル SESSION_ENGINE=
'django.contrib.sessions.backends.file'
ローカルファイルにセッション情報を保存する。
キャッシュ SESSION_ENGINE=
'django.contrib.sessions.backends.cache'
キャッシュシステム(後述)にセッション情報を保存する。

次のページ
キャッシュシステム

修正履歴

この記事は参考になりましたか?

Djangoチュートリアル連載記事一覧
この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 佐藤 治夫 (株式会社ビープラウド)(サトウ ハルオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4264 2009/09/16 17:58

おすすめ

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー