Edited at

DjangoのAdmin やりたいこと逆引き(基本)


DjangoのAdmin便利だけど、ドキュメントの説明がくどい。

読めばわかるけど、その読む時間が微妙に無駄になったりする。忘れるし。

というわけで逆引き的に便利そうなやつだけまとめてadmin書くときにこれを見ればだいたいのことは簡単にサンプルコードとどういう見た目になるかをまとめることにする。(adminで色々やりすぎは注意)


閲覧画面に表示する(list_display)

公式

class PersonAdmin(admin.ModelAdmin):

list_display = ('first_name', 'last_name')


adminフォームに表示しない(exclude)

公式

from django.contrib import admin

class AuthorAdmin(admin.ModelAdmin):
fields = ('name', 'title')

class AuthorAdmin(admin.ModelAdmin):
exclude = ('birth_date',)


adminにフォーム表示する(fields)

公式

class FlatPageAdmin(admin.ModelAdmin):

fields = ('url', 'title', 'content')

複数の項目を同じ行に表示させる場合はこう

class FlatPageAdmin(admin.ModelAdmin):

fields = (('url', 'title'), 'content')


一部の値だけアコーディオン形式にして非表示にしておく(fieldsets collapse)

公式

公式の画像にある、Advanced options(show)って書かれているところみたいに、一部の項目だけ非表示にしておくことができる。is_staffみたいな要素に使ったりする。

from django.contrib import admin

class FlatPageAdmin(admin.ModelAdmin):
fieldsets = (
(None, {
'fields': ('url', 'title', 'content', 'sites')
}),
('Advanced options', {
'classes': ('collapse',),
'fields': ('registration_required', 'template_name'),
}),
)


ManytoManyフィールドを追加しやすくする(filter_horizontal/filter_vertical)

公式


一覧表示画面から編集のリンクがidにしかなくて変えたい(list_display_links)

公式

class PersonAdmin(admin.ModelAdmin):

list_display = ('first_name', 'last_name', 'birthday')
list_display_links = ('first_name', 'last_name')


一々編集画面に飛ばないで編集しちゃいたい(list_editable)

公式

LqxrN.png

参考


フィルタを付けたい(list_filter)

公式


  • 普通に使う場合

class PersonAdmin(admin.ModelAdmin):

list_filter = ('is_staff', 'company')


  • 参照先の属性でフィルタする場合

class PersonAdmin(admin.UserAdmin):

# __を付けて関係先を参照
list_filter = ('company__name',)


ページに表示させるアイテム数を制限(list_per_page)

デフォルトは100

公式


adminでもselect_relatedを使う

公式

class ArticleAdmin(admin.ModelAdmin):

list_select_related = ('author', 'category')


並べ方を指定しておく(ordering)

公式


python dict的な感じのフォームにしたい()

下の例だと、Slug : titleのフォーム みたいな感じになる。

class ArticleAdmin(admin.ModelAdmin):

prepopulated_fields = {"slug": ("title",)}


検索ボックスを作る(search_fields)

公式


指定するフィールドの種類は、CharFieldTextField といったテキストフィールドである必要があります。


search_fields = ['foreign_key__related_fieldname']

search_fields = ['user__email']


モデルを時系列順に上のタブで管理する(date_hierarchy)

date-hieraky.png

こんな感じ

参考

公式


値がない項目を-ではない値にして表示する(empty_value_display)

参考

公式

List_displayは表示画面の方で、fields,excludeは追加編集画面に関するもので混同しやすいので一つの塊として書いておく


複数のモデルを一つの編集画面で追加編集したい

公式


  • StackedInline


    • 下に積み上げていく方式



  • TabularInline


    • 表形式



StackedInlineの例があったサイト

from django.db import models

class Author(models.Model):
name = models.CharField(max_length=100)

class Book(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
title = models.CharField(max_length=100)

StackedInline例

from django.contrib import admin

class BookInline(admin.TabularInline):
model = Book

class AuthorAdmin(admin.ModelAdmin):
inlines = [
BookInline,
]


OneToOneFieldを扱うとき

公式


ManyToManyFieldを扱うとき

公式