Personal tools
Navigation
About this blog
なごすいぶろぐ。「すべてはなごすいのために」。
Categories
COREBlog2 (29)
Zope (59)
Linux (26)
Misc (47)
Nagosui (11)
ReadingCOREBlog (7)
Plone (74)
Python (17)
Turbogears (18)
COREBlog1 (30)
moblog (5)
Django (12)
Recent entries
ALAにJeffさんの記事が。 nyusuke 2007-06-14
WebデザイナーのためのDjangoはじめの一歩 nyusuke 2007-05-29
東海Python Workshop 01終了 nyusuke 2007-05-27
東海Python Workshop 01が開催されます nyusuke 2007-05-13
管理画面からみるPlone3.0ベータ(後半) nyusuke 2007-05-03
Recent comments
Re:WebデザイナーのためのDjangoはじめの一歩 nyusuke 2007-06-01
Re:WebデザイナーのためのDjangoはじめの一歩 pateo 2007-05-31
Re:東海Python Workshop 01終了 nyusuke 2007-05-31
Re:東海Python Workshop 01終了 kfuruhata 2007-05-30
Re:管理画面からみるPlone3.0ベータ(前半) nyusuke 2007-05-03
Recent trackbacks
Plone Captcha 1.0.2 と Plone Captchas 1.0 takalog 2007-01-13
plone 2.5.2-rc1 にアップグレード takalog 2007-01-05
Vine Linux 4.0 にアップグレード(その1) takalog 2006-11-26
オハイオ州日本語サイトを手かけ始めた ロバートのブログ 2006-08-14
TurboGears関連記事 Twisted Mind in TurboGears 2006-08-06
Recent Changes
All recent changes…
Amazon Items






Adsense
Document Actions

Django

Up one level

Document Actions

Python 2.5でDjangoをインストールする

by nyusuke posted at 2007-01-03 02:26 last modified 2007-01-03 02:26

とりあえずインストールしなければ何も始まらないのでDjangoをインストールします。インストール手順は増田さんのドキュメントを見れば問題ないでしょう。ただしここには2.5だとうまくいかない旨が書かれています。

また,Python 2.5 を使っている場合にはうまく動作しないでしょう.その場合には,後で説明する方法に従って開発版をインストールしてください.

で、開発版インストールにはSubversionが必要なんですが、今このエントリを書いているウチのノートパソコンにはSubversionがインストールされていません。まぁインストールすればいいのですが、何とかすれば何とかなるんじゃないのか?という思いからSubversionなしでいってみます。

Setuptools

Setuptoolsはdistutilsを拡張したパッケージで、これをセットアップするとeasy_installコマンド(EasyInstall Tool)を使うことができます。

easy_installコマンドを使うとPython Cheese Shopに登録されているPythonパッケージを簡単にインストールしたりできますし、何より依存関係のあるパッケージも自動的に処理してくれるので非常に便利です。DjangoもTurboGearsもこの仕組みを利用してインストールを行っています。

easy_installコマンドの簡単な使い方はここを参照するといいと思います。

Djangoのsetup.py

通常Djangoのインストールはsetup.pyを使って以下のように行います。

python setup.py install

setup.pyの中ではez_setup.pyが呼ばれ、実際にいろいろな動作を行ってくれます。このez_setup.pyではまずsetuptoolsをセットアップしています。この先頭部分を見てみると以下のようになっています。

import sys
DEFAULT_VERSION = "0.6c1"
DEFAULT_URL     = "http://cheeseshop.python.org/packages/%s/s/setuptools/" % sys.version[:3]

md5_data = {
    'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',
    'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',
    'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',
    'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',
    'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618',
    'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac',
    'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5',
    'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4',
    'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c',
    'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b',
}

先頭部にあるDEFAULT_VERSIONはセットアップされるsetuptoolsのバージョンになります。下の方にずらずらっと並んでいるのはeasy_installのためのeggファイルのmd5データです。

セットアップの流れとしては、sys.versionによって得られるバージョンのPythonに応じたeggファイルをダウンロードしてmd5をチェックし、適切だったらそれをインストールするという形になるようです。

さてここにPython 2.5でsetup.pyを使ったインストールができない理由がありそうです。

Python 2.5でsetup.pyを使うためにほげりんぐ

Python 2.5でうまくいかないのはsetuptools-0.6c1にPython 2.5用のeggファイルが用意されていないためです。無いものはダウンロードできるはずもなく、(実際にコマンドラインから試してみればわかりますが)Not foundになってしまいます。それじゃあどうするのかといえば、setuptoolsの最新版を使ってしまうというのはどうでしょう。現時点の最新版は0.6c3で、これにはPython 2.5用のeggファイルも用意されています。ということで、ez_setup.pyのDEFAULT_VERSIONを0.6c3にし、0.6c3用のmd5データも追加します。

DEFAULT_VERSION = "0.6c3" # 0.6c3に変更
DEFAULT_URL     = "http://cheeseshop.python.org/packages/%s/s/setuptools/" % sys.version[:3]

md5_data = {
    'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',
    'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',
    'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',
    'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',
    'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618',
    'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac',
    'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5',
    'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4',
    'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c',
    'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b',
    'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e', # ついでに2.4用のやつも追加してしまった
    'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e', # 2.5用のmd5を追加
}

これでOK!どうなってもしらんけど!

よし、インストールしてしまおう。

C:\python25\python.exe setup.py install

インストールしたらあとはdjango-admin.pyしてプロジェクトのひな形を作成してしまおう。

django-admin.py startproject mysite

よし、インストール完了!

と思ったら露木さんからありがたいお言葉が…orz

本来は、Djangoが動作する環境の構築はプログラマが行うのですが、
今回は申し訳ないのですがご自身で構築してください。
Djangoはsvn版をインストールしてください。

お後がよろしいようで。

Category(s)
Python Python
Django
The URL to Trackback this entry is:
http://nagosui.org/Nagosui/COREBlog2/install-django-with-python-2.5/tbping

Djangoの管理画面までたどり着くための準備

by nyusuke posted at 2007-01-06 00:36 last modified 2007-01-06 00:44

結局SVNから最新版のDjango-0.96-preを落としてくることになったわけですが、さていろいろいじってみようじゃありませんか。何せ管理画面がかっこいいという噂ですから、とにかくこれを見ずにはいられませぬ。ブックマークアプリを作ってみようっと。

プロジェクトの作成と設定

Djangoでは一つのプロジェクトに複数アプリが含まれてるような感じになってるようです。

  • プロジェクトA
    • アプリ1
    • アプリ2
    • アプリ3
    • アプリつづく…

TurboGearsではtg-adminコマンドを使っていろいろやっておりましたが、Djangoではdjango-admin.pyやmanage.pyというコマンドを使っていろいろやるようです。特にmanage.pyはあとあと何度も何度も使うことになりそうです。

プロジェクトを作る

とりあえず「mybookmarks」というプロジェクトを作ります。

django-admin.py startproject mybookmarks

おっけー。「mybookmarks」っていうディレクトリができました。空っぽのプロジェクトができたみたい(・∀・)

プロジェクトの設定をする

ちょー最低限の設定をします。データベースと基本アプリの組み込みです。設定は「mybookmark」ディレクトリ内の「settings.py」を編集して行います。

データベースの設定は、settings.pyの前半の方にあります。ここはsqliteで。

DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = 'bookmarks.sqlite'

組み込むアプリの設定は、settings.pyの一番最後にあります。

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
)

こんなふうにデフォルトで4つのアプリが登録されていますが、Djangoといえば管理画面です。管理画面を実装しないDjangoなぞに興味はございません。管理画面を使うためには管理アプリも登録しておく必要があります。ということでとりあえず最後に一行加えておきます。

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
'django.contrib.admin', # 管理画面アプリを追加
)

ところでここには後々自分で作ったアプリを登録していくことになります。例えばこんなふうに:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
'django.contrib.admin',
'mybookmarks.bookmarks', # bookmarksアプリを作ったら追加する
'mybookmarks.hogeapp', # hogeappアプリを作ったら追加する
'mybookmarks.fugaapp', # fugaappアプリを作ったら追加する
)

あとから追加するのもめんどうなので今のウチにこれから作るアプリを登録しちゃいます。

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
'django.contrib.admin', # 管理画面アプリを追加
'mybookmarks.bookmarks', # これから作るアプリを前もって追加しちゃう
# 「プロジェクト名.アプリ名」という感じで。
)

他にも設定項目はたくさんあるけど放置( ´_つ`)

最後に管理画面を使うための設定をもう一つだけ。「urls.py」の次の部分のコメントアウトを解除しておきます。

    # Uncomment this for admin:
#     (r'^admin/', include('django.contrib.admin.urls')),

↓コメントアウトする

    # Uncomment this for admin:
     (r'^admin/', include('django.contrib.admin.urls')),

アプリケーションの作成とmanage.py

さてプロジェクトの設定が終わったところで、中身となるアプリケーションのひな型を作っていきます。今回は「bookmarks」というアプリケーションを作りますので「mybookmarks」ディレクトリ(manage.pyがある場所)で以下のようにします:

manage.py startapp bookmarks

「manage.py」については「manage.py --help」で詳細が分かります。manage.pyはすごくよく使いそうな悪寒がします。特によく使いそうなコマンドは:

  • manage.py runserver:サーバを起動する
  • manage.py sql:SQLを確認する(SQL関連のコマンドはいっぱいある模様)
  • manage.py syncdb:アプリ用データベーステーブルを作成する

とりあえず空っぽのアプリができた&準備ができたーヾ( ´( ェ )`)ノ

Category(s)
Django
The URL to Trackback this entry is:
http://nagosui.org/Nagosui/COREBlog2/ready-for-django-admin/tbping

Djangoの管理画面までちょっと近づいた

モデルに必要な基本的なフィールドを作る

by nyusuke posted at 2007-01-08 02:06 last modified 2007-01-08 02:15

ブックマークアプリを自分でも作ってみるシリーズ。

前回で準備が整ったのでモデルを定義していきます。

モデルの定義はアプリケーションのディレクトリ内(今回の場合はbookmarksディレクトリ)のmodels.pyを編集することで行います。モデルはPythonのクラスとして表現され、その中身はだいたい大枠としてこんな感じになる予感がします:

class クラス名(models.Model):
………

def __str__():
………

class Admin():
………

class Meta():
………

ちなみに__str__、Admin、Metaについては主に管理画面用の設定です。これらを設定すると管理画面がぐっと見やすく使いやすくなります。

これらのモデルに基づいたデータベーステーブルを生成するためには、プロジェクトディレクトリ内(manage.pyがあるディレクトリ:今回の場合はmybookmarksディレクトリ)で

manage.py syncdb

とします。

以後、モデルの具体的な内容が固まるまで

  • models.pyの編集
  • manage.py syncdb

を繰り返しながら試行錯誤することになるのかな。

今回はとりあえず管理画面に関係しない部分(__str__、Admin、Meta以外の部分)を作っていこうと思います。

ブックマークアプリに必要なテーブルを考える

定義する前にどのようなものをデータベースに格納するのかを考えてまとめておきたいと思います。今回はタグ付きのブックマークアプリを作ろうというわけですから、ブックマークテーブルおよびタグテーブルの2つを定義することにします(実際にはリレーションのためのテーブルも生成されます)。

まずはブックマークテーブルから考えてみます。

例えばFirefoxのブックマークのプロパティには以下のような項目が存在します。

  • 名前
  • URL
  • キーワード
  • 説明

この中にあるキーワードというのはいわゆるタグとは別物ですが、設定項目としてはこれにならえばいいのではないかと思います。また例えばdel.icio.usなどにはそのブックマークを登録した日付も記録されていますので、日付も追加することにします。

というわけで、ブックマークテーブルには以下のフィールドを保存することにします。

  • 名前
  • URL
  • 説明
  • タグ(下記のタグテーブルとリレーションを張る)
  • 日付

さて次にタグテーブルの方ですが、こちらは簡単すませてしまいましょう。

タグテーブルには以下のフィールドを保存することにします。

  • 名前
  • 説明

一点だけ注意すべきなのはブックマークテーブルの方でリレーションを張っている部分です。リレーションには一対一、一対多、多対多などいろいろありますが、ここでは多対多の関係になります。ブックマークの「タグ」項目には複数のタグが入りますし、あるタグが付与されているブックマークも複数あるからです。

もちろんブックマークテーブルのフィールドとして

  • 名前
  • URL
  • 説明
  • 日付

を設定し、タグテーブルのフィールドとして

  • 名前
  • 説明
  • ブックマーク(ブックマークテーブルとリレーションを張る)

を設定してもよいのですが、実際に管理画面で、あるブックマークを今まさに追加しようとするときを考えてみると、「このブックマークにつけるタグはAとBとCだからぁ、まずAタグの編集画面を開いてぇ、このブックマークの名前とURLと説明を記入してぇ、次にBタグにも同じように登録してぇ、次にCタグにも(ry…」というふうに登録することはまずありえないでしょう(めんどくさすぎ)。むしろブックマーク編集画面でブックマーク追加時にタグA、B、Cを付与する方がとても自然です。すなわち、タグテーブルの中にブックマークフィールドがあるよりも、ブックマークテーブルの中にタグフィールドがある方がよいということになります。

*Djangoでは多対多のリレーションを張るには、共通項目を持つテーブルの「片方にだけ」リレーションのためのフィールドをセットします。

クラスとアトリビュート

モデルはPythonのクラスとして定義します。例えばブックマークのテーブルを作成するには:

class Bookmark(models.Model):

などとします。models.Modelを継承します。

各モデルのフィールドはPythonのクラスのアトリビュートとして定義します。どんなフィールドが定義できるのかは増田さんのドキュメントのモデルAPIリファレンスを参照するとよいでしょう。例えば上述のブックマークテーブルでは名前、URL、説明、タグ、日付というフィールドを設定しますので

  • 名前は短めの文字列になるだろうから「CharField」
  • URLはURLだから「URLField」
  • 説明はちょっと長めにして「TextField」(CharFieldでもOKだと思う)
  • タグは多対多のリレーションを張るフィールドだから「ManyToManyField」
  • 日付は日付だから「DateField」

という感じでアトリビュートを追加してやるとよいと思われます。

フィールドの書式は以下のような感じになるようです。

フィールド名 = models.フィールドの種類(オプション等)

すなわち名前、URL、説明、タグ、日付というフィールドを持ったブックマークテーブルを生成するためには:

class Bookmark(models.Model):
title = models.CharField(maxlength = 30)
url = models.URLField(unique = True)
summary = models.TextField(maxlength = 200, blank = True)
tags = models.ManyToManyField(Tag)
date = models.DateField(auto_now = True)

オプションは、まぁ、適当にドキュメントを参照しながら。

*リレーションを張るフィールド名には、リレーション先のモデル名の複数形を使うことが推奨されています。今回の場合はリレーション先モデルが「Tag」ですので「tags」としています。

ということで同じようにしてタグモデルも定義します。タグテーブルには名前と簡単な説明のためのフィールドを設定したいので以下のようにします:

class Tag(models.Model):
title = models.CharField(maxlength = 30)
summary = models.CharField(maxlength = 100, blank = True)

とりあえずモデルができたーヾ( ´( ェ )`)ノ

ここまででmodels.pyはこんな風になってます。

# coding : utf-8

from django.db import models

class Bookmark(models.Model):
title = models.CharField(maxlength = 30)
url = models.URLField(unique = True)
summary = models.TextField(maxlength = 200, blank = True)
tags = models.ManyToManyField(Tag)
date = models.DateField(auto_now = True)

class Tag(models.Model):
title = models.CharField(maxlength = 30)
summary = models.CharField(maxlength = 100, blank = True)

ここでプロジェクトディレクトリ内で「manage.py syncdb」すれば勝手にデータベースが生成されるみたい。ただし1回目だけは「スーパーユーザ作る?」って尋ねられるので「yes」と答えておきましょう(2回目以降は尋ねられません)。

先にも述べたように、今後は「モデルの編集→manage.py syncdb→モデルの編集→mana(ry」というサイクルでモデルを作り込んでいくことになろうと思われます。

Category(s)
Django
The URL to Trackback this entry is:
http://nagosui.org/Nagosui/COREBlog2/ready-for-django-admin-2/tbping

Djangoの管理画面のたぶん直前まで来た

by nyusuke posted at 2007-01-09 00:27 last modified 2007-01-09 01:18

ブックマークアプリを作ってみるシリーズ。

前回まででモデルの定義はとりあえずOKとしますが、もう少し、特に管理画面を使いやすくするための設定を加えていくことにします。これを実現するために以下の3点をmodels.pyへ加えていきます。

  • def __str__():
  • class Admin:
  • class Meta:

__str__()

増田さんのドキュメントによれば:

__str__() は,オブジェクトに対して str() を呼び出した際に返す内容を定義するための Python の特殊メソッドです. Django はそこかしこで str(obj) を使っています.

そこらじゅうで使われてるらしいのでやっぱり設定しておくべきでしょう。インスタンスのタイトルなどを表示させるのがよさそうなので、ブックマークモデル、タグモデルの両方で以下のようにしておきました。

タグモデル:

class Tag(models.Model):
title = models.CharField(maxlength = 20)
(中略)

def __str__(self):
return self.title # titleアトリビュートで設定したものを返す

ブックマークモデル:

class Bookmark(models.Model):
title = models.CharField(maxlength = 30)
(中略)

def __str__(self):
return self.title # titleアトリビュートで設定したものを返す

もちろん他のものを返してもOKです。例えばブックマークではURLを返したいというような場合は:

class Bookmark(models.Model):
url = models.URLField(unique = True)
(中略)

def __str__(self):
return self.url # urlアトリビュートで設定したものを返す

とすればよいですが、長すぎるURLとかだと非常にうざくなりそうなので、タイトル・名前くらいがちょうどいいんじゃないでしょうか。

Meta

Metaクラスにはいくつかの設定項目がありますが、管理画面を使いやすくするのに便利な項目には例えば以下のようなものがあります。

verbose_name
オブジェクトの別名を設定する。例えばBookmarkに対して「'ブックマーク'」などとする。文字列で表現する
verbose_name_plural
オブジェクトの別名の複数形。verbose_nameと同じでもさほど問題なさげ。文字列で表現する
ordering
オブジェクトのリストをどのフィールドを元にして並べるのかを設定する 。文字列のリストで表現する

orderingにはフィールド名を指定します(指定しない場合はPrimary Key順、つまり追加した順に並びます)。フィールド名をそのまま記述すれば昇順に、マイナス「-」をつけると降順に並びます。例えば現在ブックマークモデルには以下のようなフィールドが定義されています:

class Bookmark(models.Model):
title = models.CharField(maxlength = 30)
url = models.URLField(unique = True)
summary = models.TextField(maxlength = 200, blank = True)
tags = models.ManyToManyField(Tag)
date = models.DateField(auto_now = True)

この場合は、title, url, summary, tags, dateで並び替えることができます。タイトル順にしたい場合は

class Meta:
ordering = ['title']

としてやります。dateで並ばせたい場合にはもちろん、

class Meta:
ordering = ['date']

dateで降順にしたい場合はマイナス(というかハイフン)を付けます。

class Meta:
ordering = ['-date']

*複数指定することもできますが、管理画面では最初のフィールドのみ有効になるようです。

ということで以下のような感じで設定しました。

タグモデルのMeta:

class Tag(models.Model):
title = models.CharField(maxlength = 20)
(中略)

class Meta:
ordering = ['title'] # titleで並べる
verbose_name = 'tags' # オブジェクトの別名
verbose_name_plural = 'tag items' # オブジェクトの別名の複数形

ブックマークモデルのMeta:

class Bookmark(models.Model):
title = models.CharField(maxlength = 30)
(中略)
date = models.DateField(auto_now = True)

class Meta:
ordering = ['-date'] # dateで降順に並べる
verbose_name = 'bookmarks' # オブジェクトの別名
verbose_name_plural = 'bookmark items' # オブジェクトの別名の複数形

Admin

Adminはモデルを管理画面に現すために必要です。とりあえずモデルの中にclass Admin:を書かなくてはなりません。で、モデルをどのように見せるのかをAdminクラスのアトリビュートとして表現していきます。設定項目はやはり増田さんのドキュメントを参照しましょう。

ここでは以下のようなアトリビュートを設定することにします。

list_display
管理画面に表示するフィールドを指定する。文字列のタプルとして表現する
date_hierarchy
日付で絞り込められるナビゲーションを追加するための項目。モデルの中にDateフィールドやDateTimeフィールドがある場合に使える
list_filter
項目を絞り込められるサイドナビゲーションを追加するための項目。何で絞り込むかを文字列のタプルとして表現する
search_fields
管理画面に検索ボックスを追加するための項目。検索対象となるフィールドを文字列のリストとして表現する

最初の「list_display」は管理画面でオブジェクトのリストを表示するときにどのフィールドを表示するのかを設定します。設定しないと__str__で設定したもののみ表示されてしまい、なんだか素っ気ない感じになってしまうので、例えばブックマークモデルのオブジェクトに関してはtitle以外にもurlとかtagとかを表示してやった方がいいかな、と。

その他の3つはオブジェクトを管理するにあたって絞り込みや検索など、使い勝手の良さを向上させるためのものですが、まぁ、無くてもよさげな雰囲気です。

ということでタグモデルのAdmin:

class Tag(models.Model):
title = models.CharField(maxlength = 20)
summary = models.CharField(maxlength = 100, blank = True)

class Admin:
# 管理画面でtitleとsummaryを表示
list_display = ('title', 'summary')

ブックマークモデルのAdmin:

class Bookmark(models.Model):
title = models.CharField(maxlength = 30)
url = models.URLField(unique = True)
summary = models.TextField(maxlength = 200, blank = True)
tags = models.ManyToManyField(Tag)
date = models.DateField(auto_now = True)

class Admin:
# 管理画面でtitleとurlとtagsを表示
# ホントは問題アリ(詳しくは後述)
list_display = ('title', 'url', 'tags')

# tagsとdateで絞り込みできるようにする
list_filter = ('tags', 'date')

# dateで絞り込みできるナビゲーションを追加
date_hierarchy = 'date'

# タイトルを対象として検索できるサーチボックスを追加
search_fields = ['title']

ただしこのままではブックマークモデルの「list_display」に少し問題があります。ドキュメントに特殊なケースとして書かれていますが、

list_display にはいくつか特殊なケースがあります:

  • ManyToManyField フィールドの表示は,テーブルの各行に対して個別に SQL 文を実行することになってしまうのでサポートしていません.どうしても表示させたいなら,カスタムメソッドをモデルに実装して,メソッドの名前を list_display に追加してください (list_display へのカスタムメソッドの追加については,後で詳しく説明しています).

ブックマークモデルでは「tags」は「ManyToManyField」なので以下のようではうまくいきません。

list_display = ('title', 'url', 'tags')

「'tags'」の代わりに、カスタムメソッドをモデルに実装してそのメソッド名をここに追加してやる必要があります。

カスタムメソッドを作る

あるブックマークに対して付与されているタグの一覧を得るメソッドを書いてやりましょう。データベースAPIの中にall()メソッドがありますので、これによってオブジェクトの一覧を取り出し、そのタイトルをリストとして表示してやるようなメソッドを書きます。

def selected_tags(self):
'''return selected tags'''
return [x.title for x in self.tags.all()]

リスト内包表記を使わずに表現するならこんな感じでしょうか?:

def selected_tags(self):
'''return selected tags'''
tag_titles = []
for tag_obj in self.tags.all():
tag_titles.append(tag_obj.title)
return tag_titles

いずれにしろこのselected_tagsというメソッドは、ブックマークに付与されたタグのタイトルをリストで返すようになります。ということで、

list_display = ('title', 'url', 'selected_tags')

これでいいでしょう。

まとめ

前回のモデルの定義に管理画面用のものを付け足して、以下のようになりました。

# vim: fileencoding = utf-8

from django.db import models



class Tag(models.Model):
title = models.CharField(maxlength = 20)
summary = models.CharField(maxlength = 100, blank = True)

def __str__(self):
return self.title

class Admin:
list_display = ('title', 'summary')

class Meta:
ordering = ['title']
verbose_name = 'tags'
verbose_name_plural = 'tag items'



class Bookmark(models.Model):
title = models.CharField(maxlength = 30)
url = models.URLField(unique = True)
summary = models.TextField(maxlength = 200, blank = True)
tags = models.ManyToManyField(Tag, filter_interface = models.HORIZONTAL)
date = models.DateField(auto_now = True)

def __str__(self):
return self.title


def selected_tags(self):
'''return selected tags'''
tag_titles = []
for tag_obj in self.tags.all():
tag_titles.append(tag_obj.title)
return tag_titles

class Admin:
list_display = ('title', 'url', 'selected_tags')
list_filter = ('tags', 'date')
date_hierarchy = 'date'
search_fields = ['title']

class Meta:
ordering = ['-date']
verbose_name = 'bookmarks'
verbose_name_plural = 'bookmark items'

*文中では触れませんでしたが、ブックマークのtagsアトリビュートに「filter_interface = models.HORIZONTAL」を追加しています。

ここでプロジェクトディレクトリにて「manage.py syncdb」すれば、これらのモデルがデータベーステーブルに反映されます。

Category(s)
Django
The URL to Trackback this entry is:
http://nagosui.org/Nagosui/COREBlog2/ready-for-django-admin-3/tbping

Djangoの管理画面に到着

by nyusuke posted at 2007-01-11 02:26 last modified 2007-01-11 02:27

ブックマークアプリを作ってみるシリーズ。

前回まででmodels.pyはひとまずいじり終えたことにして、いよいよ管理画面を拝見してみます。プロジェクトのディレクトリでおもむろに

manage.py runserver

して、ブラウザで「http://localhost:8000/admin」へアクセス。

そして管理画面へ…

Djangoの管理画面

メイン部の下の方に、models.pyにて定義したモデルたちが仲良く並んでいます。「verbose_name_plural」を設定したので、それがここで使われています。

右の方には最近行ったアクションログが並んでおり、クリックするとモデルの編集画面へ飛びます。

モデルのリストを見る

ブックマークの方をまず見てみます。www.python.orgとcoreblog.orgを追加した後の状態です。

models.pyにて

list_display = ('title', 'url', 'selected_tags')

と設定したので、タイトル、URLと、付与されたタグが表示されています。

ブックマークのリスト

タグの方もみてみます。こちらの方は「list_display = ('title', 'summary')」としたので、タイトルと概要が表示されています。ちなみに概要の方には

summary = models.CharField(maxlength = 100, blank = True)

というふうに「blank = True」を指定しているので、中身がなくてもOKです。

タグを表示

追加する画面

とりあえず参考までに追加画面を見てみます。「blank = True」を設定した項目は、項目名が少し薄い色で表示されます(今回はブックマーク・タグのsummaryにそれぞれ「blank = True」を設定しています)。

ブックマークの追加画面です。

ブックマークの追加

タグの追加画面です。

タグの追加

もう少し詳しく

もうちょっと細かい部分を見てみます。

ブックマークのAdminクラスは以下のように設定しました。

    class Admin:
        list_display = ('title', 'url', 'selected_tags')
        list_filter = ('tags', 'date')
        date_hierarchy = 'date'
        search_fields = ['title']

list_displayの部分は既に見ましたが、他の部分は管理画面でどのように表現されるのでしょうか?

モデルを表示

おおざっぱに見ると上図のようになっています。

ちなみにタイトルバーをクリックすれば、その項目で並び替えることもできます。

タイトルバーをクリックして並び替え

search_fields

「search_fields」を設定した場合には上図の上部のようにサーチボックスが表示されます。今回の場合はtitleを指定していますので、タイトルを対象として検索が行われます。

ブックマークのタイトルで検索

date_hierarchy

「date_hierarchy」を設定した場合には(ちょっと見にくい場所にあるんですが)、日付を対象にして絞り込むことができるナビゲーションリンクバーが表示されます(あんまり使わないかも…)。

list_filter

「list_filter」を設定した場合には、画面右側に特定の項目を対象としたフィルタリストが表示されます。今回の場合は

list_filter = ('tags', 'date')

としましたので、タグと日付による絞り込みが可能になっています。

うーん、いろいろいじることができて楽しそうなんですが、眠いので今日はここまでにしておこぅっと( ̄(●●) ̄)

Category(s)
Django
The URL to Trackback this entry is:
http://nagosui.org/Nagosui/COREBlog2/arrival-in-django-admin/tbping