7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Djangoの管理画面でautocomplete機能を実装する

Last updated at Posted at 2020-06-15

Djangoの管理画面で1対多や多対多などのモデルを構築すると、デフォルトではプルダウン形式で表示されます。
少なければ問題ないですが、量が増えてくると探すのが面倒に...
pulldown.png

こういう場合はautocomplete機能を実装できるdjango-autocomplete-lightをインストールすることが多いようですが、Djangoの公式ドキュメントをよく読んでみたところ、autocompleteを実装できるautocomplete_fieldsが機能として用意されていることがわかりました。

##モデルを用意
今回はDjango3.0.7、Python3.7.2を使用しています。
わかりやすく、犬の名前と犬種を登録するdogbreedという2つのアプリを作り、それぞれのモデルを用意します。

$ python manage.py startapp dog
$ python manage.py startapp breed
dog/models.py
from django.db import models

from breed.models import Breed


class Dog(models.Model):
    name = models.CharField("Name", max_length=255, default="", blank=True)
    breed = models.ForeignKey(Breed, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

breed/models.py
from django.db import models


class Breed(models.Model):
    name = models.CharField("BreedName", max_length=255, default="", blank=True)

    def __str__(self):
        return self.name

これでbreedをいくつか登録し、dogを登録しようとすると、最初の画像のように大量のプルダウンが表示されます。

##autocompleteを実装
autocompleteを実装するために、それぞれのadmin.pyを編集します。

breed/admin.py
from django.contrib import admin

from .models import Breed


@admin.register(Breed)
class BreedAdmin(admin.ModelAdmin):
    search_fields = ('name',)

search_fiedlsに検索対象にしたいフィールド名を入れます。今回は1つしかないためnameを入れました。

dog/admin.py
from django.contrib import admin

from .models import Dog


@admin.register(Dog)
class DogAdmin(admin.ModelAdmin):
    autocomplete_fields = ('breed',)

dogの方では、autocompleteを実装したいフィールドをautocomplete_fieldsで指定します。
これだけです!めちゃくちゃ簡単。

管理画面を確認してみると
autocomplete.png
入力欄が用意されて、しっかりとフィルタリングができるようになりました。

ちなみに今回はForeignKeyを指定しましたが、ManyToManyFieldでも問題ありません。

dog/models.py
from django.db import models

from breed.models import Breed


class Dog(models.Model):
    name = models.CharField("Name", max_length=255, default="", blank=True)
    breed = models.ManyToManyField(Breed)

    def __str__(self):
        return self.name

autocomplete2.png

##参考情報
Djangoドキュメント - ModelAdmin.autocomplete_fields

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?