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

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

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

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

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

[公式](https://docs.djangoproject.com/ja/2.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display)

```python
class PersonAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name')
```

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

[公式](https://docs.djangoproject.com/ja/2.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.exclude)

```python
from django.contrib import admin

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

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



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

[公式](https://docs.djangoproject.com/ja/2.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.fields)

```python
class FlatPageAdmin(admin.ModelAdmin):
    fields = ('url', 'title', 'content')
```

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

```python
class FlatPageAdmin(admin.ModelAdmin):
    fields = (('url', 'title'), 'content')
```

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

[公式](https://docs.djangoproject.com/ja/2.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.fieldsets)

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

```python
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)

[公式](https://docs.djangoproject.com/ja/2.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.filter_horizontal)



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

[公式](https://docs.djangoproject.com/ja/2.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display_links)

```python
class PersonAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name', 'birthday')
    list_display_links = ('first_name', 'last_name')
```



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

[公式](https://docs.djangoproject.com/ja/2.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_editable)
![LqxrN.png](https://i.stack.imgur.com/LqxrN.png)

[参考](https://stackoverflow.com/questions/5843343/django-admin-list-editable-profile)



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

[公式](https://docs.djangoproject.com/ja/2.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter)

- 普通に使う場合

```python
class PersonAdmin(admin.ModelAdmin):
    list_filter = ('is_staff', 'company')
```

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

```python
class PersonAdmin(admin.UserAdmin):
      # __を付けて関係先を参照
      list_filter = ('company__name',)
```

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

デフォルトは100
[公式](https://docs.djangoproject.com/ja/2.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_per_page)



#### adminでもselect_relatedを使う

[公式](https://docs.djangoproject.com/ja/2.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_select_related)

```python
class ArticleAdmin(admin.ModelAdmin):
    list_select_related = ('author', 'category')
```

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

[公式](https://docs.djangoproject.com/ja/2.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.ordering)



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

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

```python
class ArticleAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("title",)}
```

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

[公式](https://docs.djangoproject.com/ja/2.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.search_fields)

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

例

```python
search_fields = ['foreign_key__related_fieldname']
```

```
search_fields = ['user__email']
```

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

![date-hieraky.png](https://qiita-image-store.s3.amazonaws.com/0/58089/50cf5275-9a4c-aee1-d23b-8162f4e6e450.png)
こんな感じ


[参考](https://medium.com/@hakibenita/scaling-django-admin-date-hierarchy-85c8e441dd4c)

[公式](https://docs.djangoproject.com/ja/2.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.date_hierarchy)

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

[参考](https://code-examples.net/ja/q/1adea21)

[公式](https://docs.djangoproject.com/ja/2.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.empty_value_display)



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



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

[公式](https://docs.djangoproject.com/ja/2.1/ref/contrib/admin/#inlinemodeladmin-objects)

- StackedInline
  - 下に積み上げていく方式 
- TabularInline
  - 表形式 

[StackedInlineの例があったサイト](https://djangotricks.blogspot.com/2016/12/django-administration-inlines-for-inlines.html)

```python
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例

```python
from django.contrib import admin

class BookInline(admin.TabularInline):
    model = Book

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

#### OneToOneFieldを扱うとき

[公式](https://docs.djangoproject.com/ja/2.1/ref/contrib/admin/#working-with-a-model-with-two-or-more-foreign-keys-to-the-same-parent-model)

#### ManyToManyFieldを扱うとき

[公式](https://docs.djangoproject.com/ja/2.1/ref/contrib/admin/#working-with-a-model-with-two-or-more-foreign-keys-to-the-same-parent-model)