Атрибут search_fields

Атрибут search_fields применяется к классу административной модели и представляет собой список имен полей модели. По этим полям Django автоматически создает поле поиска в интерфейсе администратора. Когда администратор вводит текст в поле поиска, Django выполняет поиск по указанным полям с использованием оператора icontains. Для полей с отношениями можно использовать синтаксис с двойным подчеркиванием.

Синтаксис

pythonclass ModelAdmin(admin.ModelAdmin):
  search_fields = ['field_name', 'other_field']

Пример . С одной моделью

Создадим модель Article и зарегистрируем её в админке с атрибутом search_fields:

pythonfrom django.db import models

class Article(models.Model):
  title = models.CharField(max_length=100)
  content = models.TextField()
  created_at = models.DateTimeField(auto_now_add=True)
  
  def __str__(self):
    return self.title
pythonfrom django.contrib import admin
from .models import Article

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
  search_fields = ['title', 'content']

Теперь в админке появится поле поиска. При вводе текста поиск будет выполняться по полям 'title' и 'content'.

Пример . С ForeignKey

Добавим модель Author с отношением ForeignKey и настроим поиск по связанным полям:

pythonfrom django.db import models

class Author(models.Model):
  name = models.CharField(max_length=50)
  email = models.EmailField()
  
  def __str__(self):
    return self.name

class Article(models.Model):
  title = models.CharField(max_length=100)
  content = models.TextField()
  author = models.ForeignKey(Author, on_delete=models.CASCADE)
  created_at = models.DateTimeField(auto_now_add=True)
  
  def __str__(self):
    return self.title
pythonfrom django.contrib import admin
from .models import Article

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
  search_fields = ['title', 'content', 'author__name', 'author__email']

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

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

Создадим несколько связанных моделей и настроим поиск по всем важным полям:

pythonfrom django.db import models

class Category(models.Model):
  name = models.CharField(max_length=50)
  slug = models.SlugField()
  
  def __str__(self):
    return self.name

class Author(models.Model):
  name = models.CharField(max_length=50)
  email = models.EmailField()
  
  def __str__(self):
    return self.name

class Article(models.Model):
  title = models.CharField(max_length=100)
  content = models.TextField()
  author = models.ForeignKey(Author, on_delete=models.CASCADE)
  categories = models.ManyToManyField(Category)
  created_at = models.DateTimeField(auto_now_add=True)
  is_published = models.BooleanField(default=False)
  
  def __str__(self):
    return self.title
pythonfrom django.contrib import admin
from .models import Article, Author, Category

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
  search_fields = [
    'title',
    'content',
    'author__name',
    'author__email',
    'categories__name'
  ]

Теперь поиск по статьям охватывает все основные поля, включая имя автора, его email и названия категорий.

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

  • атрибут list_display,
    который определяет поля, отображаемые в списке объектов
  • атрибут list_filter,
    который добавляет боковую панель для фильтрации списка
  • декоратор admin.register,
    который регистрирует модель в административной панели
  • класс ModelAdmin,
    который предоставляет все настройки для администрирования модели