今回はDjangoで自動生成される管理画面のカスタマイズとして、検索ボックスとフィルター機能を実装する方法を紹介する。

※前回記事はこちら
【Django】関連付けされたモデルを効率よく更新できるよう管理画面を拡張する

実装前の管理画面

まずは現時点での管理画面、質問一覧ページを見てみよう。

polls/admin.pyの内容は以下のとおり。

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
from django.contrib import admin
 
from .models import Choice, Question
 
class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 3
 
class QuestionAdmin(admin.ModelAdmin):
    list_display = ('question_text', 'pub_date', 'was_published_recently')
    fieldsets = [
        (None, {'fields': ['question_text']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]
 
admin.site.register(Question, QuestionAdmin)

公開日フィルター機能を実装する

まずは公開日のフィルター機能を実装する。

polls/admin.pyのQuestionAdminクラス内に以下の1行を追加するだけだ。

1
list_filter = ['pub_date']

たったこれだけのコードで、Djangoはモデルのデータ型から適切なフィルター機能を表示してくれる。

質問文の検索ボックスを実装する。

これも1行のコードのみ。

1
search_fields = ['question_text']

リストの上部に検索ボックスが表れた。

実際に検索を行ってみると、以下のように入力したワードを含むデータが抽出される。

最後にここまでのpolls/admin.pyコード全文を載せておく。

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
from django.contrib import admin
 
from .models import Choice, Question
 
class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 3
 
class QuestionAdmin(admin.ModelAdmin):
    list_display = ('question_text', 'pub_date', 'was_published_recently')
    list_filter = ['pub_date']
    search_fields = ['question_text']
    fieldsets = [
        (None, {'fields': ['question_text']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]
 
admin.site.register(Question, QuestionAdmin)