【初心者】【Python/Django】駆け出しWebエンジニアがDjangoチュートリアルをやってみた~その7~


今回はadminフォームをカスタマイズしていきます。

admin フォームのカスタマイズ

現在のadminフォームを確認していきます。

polls/admin.py
from django.contrib import admin

# Register your models here.
from .models import Question

admin.site.register(Question)

http://127.0.0.1:8000/admin/polls/question/5/change/」にアクセスすると以下の表示がされます。

admin.pyを修正する①

adminフォームをカスタマイズするためにはadmin.pyを修正します。
QuestionAdminクラスを作成し、question_text、pub_dateの表示順序を変更します。
もともとはquestion_textの下にpub_dateでしたが、以下のコードではpub_dateの下にquestion_textとします。

polls/admin.py
from django.contrib import admin

# Register your models here.
from .models import Question


class QuestionAdmin(admin.ModelAdmin):
    fields = ['question_text', 'pub_date']


admin.site.register(Question, QuestionAdmin)

admin.pyを修正する②

polls/admin.py

class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question_text']}),
        ('Date information', {'fields': ['pub_date']}),
    ]

リレーションを張ったオブジェクトの追加

Questionが表示されることは確認できましたが、Questionに紐づくChoiceも同時に表示できないものでしょうか?
チュートリアルを進めていきます。

polls/admin.py
from django.contrib import admin
from .models import Question, Choice

admin.site.register(Choice)

Choiceが追加されました。

選択肢「The sky」に紐づく質問は選択肢を開かないと確認できません。

選択肢「The sky」は質問「What's this?」に紐づいていることが確認できます。

質問と選択肢を同時に表示します。
ChoiceInlineでは3つの空白のChoiceフィールドを表示すると指定しています。

polls/admin.py
from django.contrib import admin

# Register your models here.
from .models import Question, Choice


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)

質問「What's this?」には選択肢「Not much」「The sky」があり、3つの空白選択肢欄が表示されています。

Choiceの表示が縦長になっているので、テーブル形式で表示するように修正しましょう。

polls/admin.py
class ChoiceInline(admin.TabularInline):

テーブル形式で表示され、すっきりしました。

管理サイトのチェンジリストページをカスタマイズする

チェンジリストは「http://127.0.0.1:8000/admin/<アプリ名>/<クラス名>/」で表示される内容です。

polls/admin.py
class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question_text']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]
    list_display = ('question_text', 'pub_date', 'was_published_recently')

http://127.0.0.1:8000/admin/polls/question/」を開きます。
今までは「QUESTION TEXT」カラムのみでしたが、新たに「DATA PUBLISHED」「PUBLISHED RECENTLY?」カラムが追加されました。

「QUESTION TEXT」「DATA PUBLISHED」カラムは並び替えに対応しています。
一方で「PUBLISHED RECENTLY?」カラムは並び替えに対応していないのですが、理由はメソッドの戻り値を表示しているからです。

「PUBLISHED RECENTLY?」で絞り込みをするためにfilterを使いましょう。

polls/models.py
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('data published')

    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        return timezone.now() - datetime.timedelta(days=1) <= self.pub_date <= timezone.now()
    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently?'

list_filterを追加します。

class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question_text']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]
    list_display = ('question_text', 'pub_date', 'was_published_recently')
    list_filter = ['pub_date']

サイドバーにfilterが表示されました。
「すべての期間 ("Any date")」「今日 ("Today")」「今週 ("Past 7 days")」「今月 ("This month")」「今年 ("This year")」で絞り込みできます。

続いて検索窓を作成します。

polls/admin.py
search_fields = ['question_text']

画面上部に検索窓が表示されました。

以上で終了となります。ありがとうございました。