raw_id_fields
Атрибут raw_id_fields применяется к классу ModelAdmin и позволяет заменить стандартный выпадающий список (select) для полей типа ForeignKey или ManyToManyField на поле ввода числового идентификатора. Рядом с полем ввода отображается кнопка лупы, при нажатии на которую открывается всплывающее окно со списком доступных записей для выбора.
Атрибут принимает список или кортеж имен полей модели, которые должны отображаться в виде raw_id_fields. Это особенно удобно, когда в связанной таблице содержится большое количество записей, и загрузка всех вариантов в выпадающий список занимает много времени или ресурсов.
Синтаксис
from django.contrib import admin
from .models import MyModel
class MyModelAdmin(admin.ModelAdmin):
raw_id_fields = ['field_name', 'another_field_name']
Пример . С ForeignKey
Рассмотрим модели Article и Author. В административной панели для статьи мы хотим выбирать автора через поле ввода ID:
from 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:
from 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:
from 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:
from 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. Рассмотрим полноценный пример настройки административного класса:
from 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,
который добавляет фильтрацию в боковой панели