[前回] Django+Reactで学ぶプログラミング基礎(14): Djangoチュートリアル(投票アプリその6)
はじめに
Django公式チュートリアル、その7-1です。
前回は、Djangoの静的ファイルをカスタマイズしました。
今回は、管理サイトをカスタマイズします。
Djangoアプリ作成(その7-1): 投票(poll)アプリ
今回の内容
- 管理フォームをカスタマイズ
- リレーションを張ったオブジェクトを追加
管理フォームのカスタマイズ
- デフォルトで、モデル登録フォームの作成方法
-
admin.site.register(モデル名)
を呼び出す- すると、Djangoがデフォルト形式でオブジェクトを表示してくれる
-
- 管理フォームの表示や操作をカスタマイズしたい
- オブジェクト登録時に、オプションを指定
- モデルごとに
admin
クラスを作成し、admin.site.register()
の2番目の引数に渡す
- モデルごとに
- オブジェクト登録時に、オプションを指定
質問登録フォームでフィールドの並び順を変えてみる
-
Publication date
フィールドの表示位置をQuestion
フィールドより前に変更
polls/admin.py
from random import choices
from django.contrib import admin
from .models import Question,Choice
class QuestionAdmin(admin.ModelAdmin):
fields = ['pub_date', 'question_text']
admin.site.register(Question, QuestionAdmin)
admin.site.register(Choice)
- VS Codeからサーバーを起動(すでに起動済みの場合は再起動)
C:\kanban\pollsite>..\venv\.venv\Scripts\activate
(venv) C:\kanban\pollsite>python manage.py runserver
フォームを複数のフィールドセットに分割してみる
-
fieldsets
の各タプルの先頭の要素が、フィールドセットのタイトル
polls/admin.py
from django.contrib import admin
from .models import Question
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
('質問文', {'fields': ['question_text']}),
('日付情報', {'fields': ['pub_date']}),
]
admin.site.register(Question, QuestionAdmin)
リレーションを張ったオブジェクトを追加
質問の管理ページに、関連する選択肢を表示したい
方法1: 質問と同じ方法で、管理サイトにChoice
を登録(実装済)
polls/admin.py
from random import choices
from django.contrib import admin
from .models import Question,Choice
from django.contrib import admin
from .models import Question
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
('質問文', {'fields': ['question_text']}),
('日付情報', {'fields': ['pub_date']}),
]
admin.site.register(Question, QuestionAdmin)
admin.site.register(Choice)
-
ブラウザで、管理サイトの選択肢登録画面にアクセス
-
選択肢登録フォームで、
Question
フィールドは選択ボックスとなる- データベース上の全ての質問を選択可能
- Djangoは外部キー(
ForeignKey
)表示に、<select>
ボックスを使ってくれる
-
Question
フィールドの隣にある+(質問を追加)
リンクをクリック
方法2: 質問追加時、選択肢も合わせて追加
- 方法1の問題
-
Choice
オブジェクトのシステムへの追加が非効率 - 解決案
-
Question
オブジェクト追加時に、Choice
をひと揃い追加する
-
-
-
Choice
モデルに対するregister()
を削除し、-
Question
登録部分を書き換え、以下のように指示-
Choice
オブジェクトはQuestion
管理ページから編集 - デフォルトで、 3つの
Choice
フィールドを用意
-
-
polls/admin.py
from django.contrib import admin
from .models import Choice, Question
class ChoiceInline(admin.StackedInline):
model = Choice
extra = 3
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
inlines = [ChoiceInline]
admin.site.register(Question, QuestionAdmin)
-
ブラウザで、質問登録ページを更新(F5)
-
リレーション先のオブジェクトをコンパクトなテーブル形式で表示
-
ChoiceInline
宣言を変更-
StackedInline
をTabularInline
に書き換える
-
-
polls/admin.py
class ChoiceInline(admin.TabularInline):
#...
おわりに
管理サイトをカスタマイズしました。
次回も続きます。お楽しみに。