Атрибут search_fields
Атрибут search_fields применяется к классу административной
модели и представляет собой список имен полей модели. По этим
полям Django автоматически создает поле поиска в интерфейсе
администратора. Когда администратор вводит текст в поле поиска,
Django выполняет поиск по указанным полям с использованием
оператора icontains. Для полей с отношениями можно
использовать синтаксис с двойным подчеркиванием.
Синтаксис
class ModelAdmin(admin.ModelAdmin):
search_fields = ['field_name', 'other_field']
Пример . С одной моделью
Создадим модель Article и зарегистрируем её в админке с атрибутом search_fields:
from 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
from django.contrib import admin
from .models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
search_fields = ['title', 'content']
Теперь в админке появится поле поиска. При вводе текста поиск
будет выполняться по полям 'title' и 'content'.
Пример . С ForeignKey
Добавим модель Author с отношением ForeignKey и настроим поиск по связанным полям:
from 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
from django.contrib import admin
from .models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
search_fields = ['title', 'content', 'author__name', 'author__email']
Поиск теперь выполняется по заголовку, тексту статьи, а также по имени и email автора благодаря использованию синтаксиса с двойным подчеркиванием.
Пример . С несколькими моделями
Создадим несколько связанных моделей и настроим поиск по всем важным полям:
from 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
from 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,
который предоставляет все настройки для администрирования модели