Атрибут autocomplete_fields

Атрибут autocomplete_fields применяется к классу ModelAdmin и позволяет заменить стандартный выпадающий список (select) на поле с автодополнением для полей типа ForeignKey и ManyToManyField. Вместо отображения всех связанных объектов в выпадающем списке, пользователь вводит текст, а система подгружает подходящие варианты через AJAX-запросы. Это значительно ускоряет работу с большими таблицами.

Для использования атрибута необходимо указать список имен полей, для которых нужно включить автодополнение. Также требуется, чтобы в модели, на которую ссылается внешний ключ, было указано поле ModelAdmin/attribute/search_fields/">search_fields в соответствующем классе ModelAdmin. Это поле определяет, по каким полям будет выполняться поиск.

Синтаксис

pythonfrom django.contrib import admin
from myapp.models import Article, Author

class ArticleAdmin(admin.ModelAdmin):
  autocomplete_fields = ['author', 'categories']

Пример . Для ForeignKey

Рассмотрим модели Article и Author. В статье есть внешний ключ на автора. В админке мы хотим выбирать автора через автодополнение:

pythonfrom django.contrib import admin
from myapp.models import Article, Author

class AuthorAdmin(admin.ModelAdmin):
  search_fields = ['name', 'email']

class ArticleAdmin(admin.ModelAdmin):
  autocomplete_fields = ['author']

admin.site.register(Author, AuthorAdmin)
admin.site.register(Article, ArticleAdmin)

Теперь при добавлении или редактировании статьи в поле выбора автора появится строка поиска. При вводе текста будут подгружаться авторы, у которых имя или email содержат введенную подстроку.

Пример . Для ManyToManyField

Атрибут также работает с полями ManyToManyField. Добавим в статью теги, которые будут выбираться через автодополнение:

pythonfrom django.contrib import admin
from myapp.models import Article, Tag

class TagAdmin(admin.ModelAdmin):
  search_fields = ['name', 'slug']

class ArticleAdmin(admin.ModelAdmin):
  autocomplete_fields = ['tags']

admin.site.register(Tag, TagAdmin)
admin.site.register(Article, ArticleAdmin)

Теперь в поле выбора тегов можно искать по названию или слаг-адресу. При этом можно выбрать несколько тегов, каждый из них будет добавлен через автодополнение.

Настройка поиска в связанной модели

Для корректной работы autocomplete_fields необходимо, чтобы у модели, на которую ссылается внешний ключ, был зарегистрирован класс ModelAdmin с атрибутом search_fields. Если этого не сделать, автодополнение не будет работать или будет работать некорректно:

pythonfrom django.contrib import admin
from myapp.models import Category, Article

# Обязательно нужно указать search_fields для Category
class CategoryAdmin(admin.ModelAdmin):
  search_fields = ['name', 'description']

class ArticleAdmin(admin.ModelAdmin):
  autocomplete_fields = ['category']

admin.site.register(Category, CategoryAdmin)
admin.site.register(Article, ArticleAdmin)

Пример . С несколькими полями

В одном классе ModelAdmin можно указать несколько полей для автодополнения одновременно. Например, в статье есть автор и категория, оба поля будут использовать автодополнение:

pythonfrom django.contrib import admin
from myapp.models import Article, Author, Category

class AuthorAdmin(admin.ModelAdmin):
  search_fields = ['name']

class CategoryAdmin(admin.ModelAdmin):
  search_fields = ['name']

class ArticleAdmin(admin.ModelAdmin):
  autocomplete_fields = ['author', 'category']

admin.site.register(Author, AuthorAdmin)
admin.site.register(Category, CategoryAdmin)
admin.site.register(Article, ArticleAdmin)

Смотрите также

  • атрибут search_fields,
    который определяет поля для поиска в админке
  • атрибут raw_id_fields,
    который отображает поле ввода ID вместо выпадающего списка
  • атрибут list_display,
    который управляет отображением полей в списке объектов
  • атрибут list_filter,
    который добавляет фильтры в боковую панель админки