動的なformを作る 6 - Dynamic Inline Admin site編

前提

Django 1.2以降、もしくは開発版r12297以降がインストールしてあること

仕様

  1. Admin siteで著者と書籍名、価格、ISBNを複数同時登録できるようにする。
  2. Inlineのフィールドを任意に追加できるようにする。

model作成

著者を格納するmodelと書籍名、価格、ISBNを格納できるmodelを作成します。

models.py

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length = 50)

    def __unicode__(self):
        return self.name

class Book(models.Model):
    author = models.ForeignKey(Author)
    title = models.CharField(max_length = 100)
    price = models.IntegerField(blank = True, null = True)
    isbn = models.CharField(u'ISBN', max_length = 20, blank = True, null = True)

    def __unicode__(self):
        return self.title

価格(price)とISBN(isbn)は未定の場合を想定して未入力でも登録できるように設定します。

Admin siteへ登録

admin.py

from django.contrib import admin
from appname.models import Author, Book

class BookInline(admin.TabularInline):
    model = Book

class AuthorAdmin(admin.ModelAdmin):
    inlines = [BookInline,]

admin.site.register(Author, AuthorAdmin)

動作確認

Admin siteにアクセスすると、以下のように表示されます。

dynamicinlineadmin01_01

左下の"Add another Book"をクリックしてフィールドを追加してみます。

dynamicinlineadmin01_02

追加したフィールドの一番右に"×"が表示されます。
"×"をクリックするとそのフィールドは削除されます。

次に、以下のデータを登録してみましょう。

dynamicinlineadmin01_03

"登録して編集を続ける"ボタンをクリックすると以下のような表示になります。

dynamicinlineadmin01_04

カスタマイズ

このまま使い続けてもいいのですが、機能を十分に使うことが出来ません。
そこでadmin.pyをもう少し編集します。

admin.py

from django.contrib import admin
from appname.models import Author, Book

class BookInline(admin.TabularInline):
    model = Book
    extra = 0

class AuthorAdmin(admin.ModelAdmin):
    inlines = [BookInline,]

admin.site.register(Author, AuthorAdmin)

extra = 0 を追加することにより、以下のように表現されます。

dynamicinlineadmin01_05

追加したいときに"Add another Book"をクリックすると新規のフィールドが表示されるようになります。

dynamicinlineadmin01_06

新規登録時は以下のようなフォームになります。

dynamicinlineadmin01_07

このような便利な機能が標準であるということは嬉しいことです。
Django1.2のadmin siteを利用している人は、バージョンアップを考えてみてはいかがでしょうか。

twitter 2010-02-24 17:13:01.427193

関連ページ

参照サイト

Recent Updates

URLConf Tip 01 - キャプチャの有無にかかわらず同一のviewで処理する
Markdownの入力補助"wmd"をAdmin siteで使う
ModelFormでfieldのwidgetを変更する
動的なformを作る 6 - Dynamic Inline Admin site編
Formsetsを使う3 - inlineformset_factory編
動的なformを作る 5 - django-dynamic-formset編
Formクラスからメディアを定義する
複数のmodelを結合する 2 - Proxy model編
複数のmodelを結合する 1
ModelFormでfieldの表示順番を変える
Admin siteのwidgetを個別に変更する
formfield_overridesを使ってAdmin siteのwidgetを変更する
Admin siteのlist_displayをカスタマイズする - リンク編
Admin siteのlist_displayをカスタマイズする - 基本編
Admin siteのTextareaの高さを自在に変更する - admin.py編