Djangoの管理画面で1対多や多対多などのモデルを構築すると、デフォルトではプルダウン形式で表示されます。
少なければ問題ないですが、量が増えてくると探すのが面倒に...
こういう場合はautocomplete機能を実装できるdjango-autocomplete-lightをインストールすることが多いようですが、Djangoの公式ドキュメントをよく読んでみたところ、autocompleteを実装できるautocomplete_fields
が機能として用意されていることがわかりました。
##モデルを用意
今回はDjango3.0.7、Python3.7.2を使用しています。
わかりやすく、犬の名前と犬種を登録するdog
とbreed
という2つのアプリを作り、それぞれのモデルを用意します。
$ python manage.py startapp dog
$ python manage.py startapp breed
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
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を編集します。
from django.contrib import admin
from .models import Breed
@admin.register(Breed)
class BreedAdmin(admin.ModelAdmin):
search_fields = ('name',)
search_fiedls
に検索対象にしたいフィールド名を入れます。今回は1つしかないためnameを入れました。
from django.contrib import admin
from .models import Dog
@admin.register(Dog)
class DogAdmin(admin.ModelAdmin):
autocomplete_fields = ('breed',)
dogの方では、autocompleteを実装したいフィールドをautocomplete_fields
で指定します。
これだけです!めちゃくちゃ簡単。
管理画面を確認してみると
入力欄が用意されて、しっかりとフィルタリングができるようになりました。
ちなみに今回はForeignKeyを指定しましたが、ManyToManyFieldでも問題ありません。
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