Атрибут autocomplete_fields
Атрибут autocomplete_fields применяется к классу ModelAdmin и позволяет заменить стандартный выпадающий список (select) на поле с автодополнением для полей типа ForeignKey и ManyToManyField. Вместо отображения всех связанных объектов в выпадающем списке, пользователь вводит текст, а система подгружает подходящие варианты через AJAX-запросы. Это значительно ускоряет работу с большими таблицами.
Для использования атрибута необходимо указать список имен полей, для которых нужно включить автодополнение. Также требуется, чтобы в модели, на которую ссылается внешний ключ, было указано поле ModelAdmin/attribute/search_fields/">search_fields в соответствующем классе ModelAdmin. Это поле определяет, по каким полям будет выполняться поиск.
Синтаксис
from django.contrib import admin
from myapp.models import Article, Author
class ArticleAdmin(admin.ModelAdmin):
autocomplete_fields = ['author', 'categories']
Пример . Для ForeignKey
Рассмотрим модели Article и Author. В статье есть внешний ключ на автора. В админке мы хотим выбирать автора через автодополнение:
from 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. Добавим в статью теги, которые будут выбираться через автодополнение:
from 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. Если этого не сделать, автодополнение не будет работать или будет работать некорректно:
from 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 можно указать несколько полей для автодополнения одновременно. Например, в статье есть автор и категория, оба поля будут использовать автодополнение:
from 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,
который добавляет фильтры в боковую панель админки