Атрибут readonly_fields
Атрибут readonly_fields используется в классе
ModelAdmin для указания полей, которые будут
отображаться только для чтения при редактировании
существующих записей. Это полезно для полей, которые
должны быть видны пользователю, но не должны изменяться
им, например, поля с датой создания записи или
вычисляемые поля. Атрибут принимает кортеж или список
строк с именами полей модели или вызываемых объектов.
Синтаксис
from django.contrib import admin
from myapp.models import Article
class ArticleAdmin(admin.ModelAdmin):
readonly_fields = ('field_name', 'another_field')
Пример . С простыми полями
Предположим, у нас есть модель статьи с полями
'title', 'content', 'created_at'
и 'updated_at'. Сделаем поля с датами
только для чтения:
from django.contrib import admin
from myapp.models import Article
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'created_at', 'updated_at')
readonly_fields = ('created_at', 'updated_at')
Теперь при редактировании статьи поля 'created_at'
и 'updated_at' будут отображаться как обычный
текст, а не как поля ввода, и их значения нельзя будет
изменить через форму редактирования.
Пример . С вычисляемым полем
Атрибут readonly_fields также поддерживает
использование вызываемых объектов (методов или функций)
для создания вычисляемых полей, которые отображаются
только для чтения:
from django.contrib import admin
from django.utils.html import format_html
from myapp.models import Article
class ArticleAdmin(admin.ModelAdmin):
readonly_fields = ('created_at', 'full_content_preview')
def full_content_preview(self, obj):
if len(obj.content) > 100:
return format_html(
'{}...',
obj.content[:100]
)
return obj.content
full_content_preview.short_description = 'Превью контента'
В этом примере метод full_content_preview
возвращает первые 100 символов содержимого статьи,
а readonly_fields включает это вычисляемое поле.
Поле будет отображаться в форме редактирования как
текст, но его значение вычисляется динамически на основе
данных модели.
Пример . С ForeignKey
Для полей типа ForeignKey также можно использовать
readonly_fields, чтобы отобразить связанный
объект только для чтения:
from django.contrib import admin
from myapp.models import Article, Category
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'category', 'created_at')
readonly_fields = ('category', 'created_at')
Теперь поле 'category' будет отображаться как
текстовое представление связанной категории, и его
нельзя будет изменить через выпадающий список.
Смотрите также
-
атрибут
list_display,
который определяет поля, отображаемые в списке записей -
атрибут
fields,
который определяет порядок и набор полей в форме редактирования -
атрибут
exclude,
который исключает поля из формы редактирования -
атрибут
list_editable,
который позволяет редактировать поля прямо в списке записей