РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
604 of 818 menu

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,
    который добавляет фильтрацию в боковой панели
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить