SHOEISHA iD

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

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

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

Djangoチュートリアル

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

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


Itemモデル一覧のカスタマイズ

 次に商品の一覧表示で商品コード以外にも、商品名、価格が表示されるようにカスタマイズしてみましょう。Djangoに用意されている一覧表示のデフォルト表示は、商品コード(item_code)だけが表示されています。これはモデルのUnicode 表記(Itemモデルの)が呼び出され表示されているものです。

[リスト5]models.py(Itemモデルの__unicode__関数)
class Item(models.Model):
    item_code = models.CharField(u'商品コード',max_length=256,unique=True)
    ~省略
    def __unicode__(self):
        return self.item_code

 管理インターフェイス上のモデル操作をカスタマイズするには、アプリケーションフォルダのadmin.pyに ModelAdmin(django.contrib.admin)を継承したクラスを作成し、そこにカスタマイズ内容を定義します。ここでは ModelAdminを継承したItemAdminクラスを作成します。一覧表示に表示したい項目を指定するには、list_display属性に Pythonのタプル形式でモデルのフィールド名(item_code、item_name、price)を定義します。クラスを定義後、admin.site.registerメソッドの引数に、ItemAdminも渡すように修正します。リスト6に修正後のadmin.pyを示します。

[リスト6]admin.py(ItemAdminクラスの追加)
# -*- coding: utf-8 -*-
from django.contrib import admin
from ecsite.itempage.models import Item

class ItemAdmin(admin.ModelAdmin):
    list_display = ('item_code', 'item_name','price') # 一覧表示したいフィールドを設定

admin.site.register(Item,ItemAdmin) #ItemAdminクラスも追加

 admin.pyに定義したら開発サーバを再起動し、Itemモデルの一覧表示画面を表示してみましょう。図6のように商品コード(item_code)、商品名(item_name)、価格(price)が表示されます。

図6 Itemモデルの一覧画面
図6 Itemモデルの一覧画面

 Django の管理インターフェイスをカスタマイズするには、今回紹介したようにadmin.pyファイルにカスタマイズ内容を定義していきます。今回紹介した以外にも、さまざまなカスタマイズが提供されていて柔軟にカスタマイズできることが管理インターフェイスの特徴です。それらの方法についてはDjango本家サイトのドキュメントを参照してください。

Djangoの管理インターフェイスを用いたアプリケーションの例

 Django の管理インターフェイスのうまくカスタマイズした事例としてはReview Boardがあげられます。Review BoardはVM Wareの開発チームが使用しているDjangoで開発されたソースレビュー用のアプリケーションです。管理インターフェイスのカスタマイズ事例として参考にすると良いでしょう。

HTTPステータスの制御

 前編で、商品ページの表示機能を実装しましたが、存在しないIDのURLが指定された場合、図7のようにサーバーエラー画面(HTTPレスポンスコード500)が表示されてしまいます。

図7 Itemモデルが存在しない場合のサーバエラー
図7 Itemモデルが存在しない場合のサーバエラー

 ここはサーバエラーにならずにHTTPレスポンスコードの404(ページが存在しない)を返すように実装してみましょう。モデルの取得に使用している「Item.objects.get」関数は、データが存在しない場合Item.DoesNotExist例外を送出しますのでexcept節でハンドリングし、404レスポンスコードを返すためのオブジェクトをraiseします。この404レスポンスコードを返すためのオブジェクトはdjangoが用意しているクラスであるdjango.http.Http404を使用します。アプリケーションフォルダのviews.pyの「item_page_display」ビュー関数を、リスト7のように編集します。

[リスト7]views.py(データが存在しない場合、404エラーを返す)
from django.http import Http404

def item_page_display(request,item_id):
    try:
        item = Item.objects.get(id=item_id)
    except Item.DoesNotExist:
        raise Http404

    t = loader.get_template('page/item.html')
    c = Context(
        {'item':item }
    )
    return HttpResponse(t.render(c))

 記述を追加後、商品ページをリロードしてみましょう。図8のように404エラーが表示されることが確認できます。

図8 Itemモデルが存在しない場合の404エラー
図8 Itemモデルが存在しない場合の404エラー

次のページ
ショートカットの使用

修正履歴

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

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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー