Itemモデル一覧のカスタマイズ
次に商品の一覧表示で商品コード以外にも、商品名、価格が表示されるようにカスタマイズしてみましょう。Djangoに用意されている一覧表示のデフォルト表示は、商品コード(item_code)だけが表示されています。これはモデルのUnicode 表記(Itemモデルの)が呼び出され表示されているものです。
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を示します。
# -*- 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)が表示されます。
Django の管理インターフェイスをカスタマイズするには、今回紹介したようにadmin.pyファイルにカスタマイズ内容を定義していきます。今回紹介した以外にも、さまざまなカスタマイズが提供されていて柔軟にカスタマイズできることが管理インターフェイスの特徴です。それらの方法についてはDjango本家サイトのドキュメントを参照してください。
Django の管理インターフェイスのうまくカスタマイズした事例としてはReview Boardがあげられます。Review BoardはVM Wareの開発チームが使用しているDjangoで開発されたソースレビュー用のアプリケーションです。管理インターフェイスのカスタマイズ事例として参考にすると良いでしょう。
HTTPステータスの制御
前編で、商品ページの表示機能を実装しましたが、存在しないIDのURLが指定された場合、図7のようにサーバーエラー画面(HTTPレスポンスコード500)が表示されてしまいます。
ここはサーバエラーにならずにHTTPレスポンスコードの404(ページが存在しない)を返すように実装してみましょう。モデルの取得に使用している「Item.objects.get」関数は、データが存在しない場合Item.DoesNotExist例外を送出しますのでexcept節でハンドリングし、404レスポンスコードを返すためのオブジェクトをraiseします。この404レスポンスコードを返すためのオブジェクトはdjangoが用意しているクラスであるdjango.http.Http404を使用します。アプリケーションフォルダのviews.pyの「item_page_display」ビュー関数を、リスト7のように編集します。
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エラーが表示されることが確認できます。



