【初心者】【Python/Django】駆け出しWebエンジニアがDjangoチュートリアルをやってみた~その7~
今回はadminフォームをカスタマイズしていきます。
admin フォームのカスタマイズ
現在のadminフォームを確認していきます。
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とします。
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を修正する②
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date']}),
]
リレーションを張ったオブジェクトの追加
Questionが表示されることは確認できましたが、Questionに紐づくChoiceも同時に表示できないものでしょうか?
チュートリアルを進めていきます。
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フィールドを表示すると指定しています。
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の表示が縦長になっているので、テーブル形式で表示するように修正しましょう。
class ChoiceInline(admin.TabularInline):
管理サイトのチェンジリストページをカスタマイズする
チェンジリストは「http://127.0.0.1:8000/admin/<アプリ名>/<クラス名>/」で表示される内容です。
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を使いましょう。
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")」で絞り込みできます。
続いて検索窓を作成します。
search_fields = ['question_text']
画面上部に検索窓が表示されました。
以上で終了となります。ありがとうございました。
Author And Source
この問題について(【初心者】【Python/Django】駆け出しWebエンジニアがDjangoチュートリアルをやってみた~その7~), 我々は、より多くの情報をここで見つけました https://qiita.com/oboerarenai_user/items/3f8e30b48501a919e8a7著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .