動的なformを作る 6 - Dynamic Inline Admin site編
前提
Django 1.2以降、もしくは開発版r12297以降がインストールしてあること
仕様
- Admin siteで著者と書籍名、価格、ISBNを複数同時登録できるようにする。
- 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にアクセスすると、以下のように表示されます。
左下の"Add another Book"をクリックしてフィールドを追加してみます。
追加したフィールドの一番右に"×"が表示されます。
"×"をクリックするとそのフィールドは削除されます。
次に、以下のデータを登録してみましょう。
"登録して編集を続ける"ボタンをクリックすると以下のような表示になります。
カスタマイズ
このまま使い続けてもいいのですが、機能を十分に使うことが出来ません。
そこで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 を追加することにより、以下のように表現されます。
追加したいときに"Add another Book"をクリックすると新規のフィールドが表示されるようになります。
新規登録時は以下のようなフォームになります。
このような便利な機能が標準であるということは嬉しいことです。
Django1.2のadmin siteを利用している人は、バージョンアップを考えてみてはいかがでしょうか。
関連ページ
- Formsetsを使う3 - inlineformset_factory編
- 動的なformを作る 5 - django-dynamic-formset編
- 動的なformを作る 4 - 文字列からformオブジェクトを作成する widgets変更編
- 動的なformを作る 3 - 文字列からformオブジェクトを作成する 基本編
- Formsetsを使う2 - modelformset_factory編
- Formsetsを使う1 - formset_factory編
- 動的なformを作る2 - jQueryを使って複数のコンボボックスを連動させる
- 動的なformを作る1 - ModelChoiceField利用編






