raw_id_fields

Атрибут raw_id_fields применяется к классу ModelAdmin и позволяет заменить стандартный выпадающий список (select) для полей типа ForeignKey или ManyToManyField на поле ввода числового идентификатора. Рядом с полем ввода отображается кнопка лупы, при нажатии на которую открывается всплывающее окно со списком доступных записей для выбора.

Атрибут принимает список или кортеж имен полей модели, которые должны отображаться в виде raw_id_fields. Это особенно удобно, когда в связанной таблице содержится большое количество записей, и загрузка всех вариантов в выпадающий список занимает много времени или ресурсов.

Синтаксис

pythonfrom django.contrib import admin
from .models import MyModel

class MyModelAdmin(admin.ModelAdmin):
  raw_id_fields = ['field_name', 'another_field_name']

Пример . С ForeignKey

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

pythonfrom django.db import models

class Author(models.Model):
  name = models.CharField(max_length=100)

  def __str__(self):
    return self.name

class Article(models.Model):
  title = models.CharField(max_length=200)
  author = models.ForeignKey(Author, on_delete=models.CASCADE)
  created_at = models.DateTimeField(auto_now_add=True)

Теперь зарегистрируем модель Article в админке и укажем поле author в атрибуте raw_id_fields:

pythonfrom django.contrib import admin
from .models import Article

class ArticleAdmin(admin.ModelAdmin):
  list_display = ['title', 'author', 'created_at']
  raw_id_fields = ['author']

admin.site.register(Article, ArticleAdmin)

Результат: вместо выпадающего списка со всеми авторами в форме редактирования статьи появится поле для ввода числового ID автора и кнопка для выбора.

Пример . С ManyToManyField

Атрибут raw_id_fields также работает с полями типа ManyToManyField. Добавим к модели Article поле categories:

pythonfrom django.db import models

class Category(models.Model):
  name = models.CharField(max_length=100)

  def __str__(self):
    return self.name

class Article(models.Model):
  title = models.CharField(max_length=200)
  author = models.ForeignKey(Author, on_delete=models.CASCADE)
  categories = models.ManyToManyField(Category)
  created_at = models.DateTimeField(auto_now_add=True)

Обновим административный класс, добавив поле categories в raw_id_fields:

pythonfrom django.contrib import admin
from .models import Article

class ArticleAdmin(admin.ModelAdmin):
  list_display = ['title', 'author', 'created_at']
  raw_id_fields = ['author', 'categories']

admin.site.register(Article, ArticleAdmin)

Результат: для выбора категорий будет отображаться поле ввода ID, аналогичное полю для внешнего ключа. Можно вводить несколько ID через запятую.

Пример . Комбинирование с другими атрибутами

Атрибут raw_id_fields можно комбинировать с другими настройками, такими как list_display, search_fields и list_filter. Рассмотрим полноценный пример настройки административного класса:

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

class ArticleAdmin(admin.ModelAdmin):
  list_display = ['title', 'author', 'get_categories', 'created_at']
  list_filter = ['author', 'created_at']
  search_fields = ['title', 'author__name']
  raw_id_fields = ['author', 'categories']

  def get_categories(self, obj):
    return ", ".join([c.name for c in obj.categories.all()])
  get_categories.short_description = 'Categories'

admin.site.register(Article, ArticleAdmin)

В результате на странице списка статей отображаются заголовок, автор, категории и дата создания. При редактировании статьи поля author и categories будут представлены в виде полей ввода ID, что упрощает работу с большими объемами данных.

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

  • атрибут autocomplete_fields,
    который добавляет автодополнение при выборе связанных записей
  • атрибут list_display,
    который определяет поля, отображаемые в списке объектов
  • атрибут search_fields,
    который включает поиск по указанным полям
  • атрибут list_filter,
    который добавляет фильтрацию в боковой панели