Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# admin.py в Django
admin.py — это файл, в котором регистрируются модели в Django Admin Panel. Django Admin — это автоматически генерируемый интерфейс для управления БД без написания кода.
Зачем нужен admin.py
Без admin.py пришлось бы писать собственный CRUD интерфейс. Django админ автоматически:
- Показывает список записей
- Позволяет создавать, редактировать, удалять записи
- Фильтровать и искать
- Экспортировать данные
Базовое использование
# models.py
from django.db import models
class User(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
created_at = models.DateTimeField(auto_now_add=True)
# admin.py
from django.contrib import admin
from .models import User
# Самый простой способ: только регистрация
admin.site.register(User)
Теперь модель User видна в Django Admin по адресу /admin/.
Настройка с ModelAdmin
Для полного управления используется класс ModelAdmin:
from django.contrib import admin
from .models import User
class UserAdmin(admin.ModelAdmin):
# Колонки в списке
list_display = ('id', 'name', 'email', 'created_at')
# Как часто обновлять
list_per_page = 50
# Фильтры справа
list_filter = ('created_at', 'email')
# Поля для поиска
search_fields = ('name', 'email')
# Поля только для чтения
readonly_fields = ('created_at', 'id')
# Порядок полей при редактировании
fields = ('name', 'email', 'created_at')
# Группировка полей
fieldsets = (
('Basic Info', {
'fields': ('name', 'email')
}),
('Metadata', {
'fields': ('created_at', 'id'),
'classes': ('collapse',) # свёрнуто по умолчанию
})
)
admin.site.register(User, UserAdmin)
Работа с related объектами (Inline)
Если модель имеет ForeignKey, можно редактировать связанные объекты встроенно:
# models.py
class User(models.Model):
name = models.CharField(max_length=100)
class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
content = models.TextField()
# admin.py
class PostInline(admin.TabularInline):
model = Post
extra = 1 # одна пустая форма для добавления
fields = ('title', 'content')
class UserAdmin(admin.ModelAdmin):
list_display = ('id', 'name')
inlines = [PostInline] # вложенное редактирование постов
admin.site.register(User, UserAdmin)
Пользовательские действия (Actions)
Добавления массовых операций:
def mark_as_verified(modeladmin, request, queryset):
queryset.update(is_verified=True)
mark_as_verified.short_description = "Mark selected users as verified"
class UserAdmin(admin.ModelAdmin):
actions = [mark_as_verified]
admin.site.register(User, UserAdmin)
Пермиссии и безопасность
Django админ автоматически проверяет права доступа:
from django.contrib.auth.decorators import permission_required
class UserAdmin(admin.ModelAdmin):
# Требует permission add_user, change_user, delete_user, view_user
list_display = ('id', 'name', 'email')
def has_add_permission(self, request):
# Переопределяем права добавления
return request.user.is_superuser
def has_delete_permission(self, request, obj=None):
# Скрыть удаление для обычных админов
return request.user.groups.filter(name='SuperAdmin').exists()
Фильтры и поиск
from django.contrib import admin
from django.utils.html import format_html
class UserAdmin(admin.ModelAdmin):
list_display = (
'id',
'name',
'email',
'status_colored', # пользовательское поле
'created_at'
)
list_filter = (
'created_at',
'is_verified',
('email', admin.RelatedOnlyFieldListFilter), # фильтр по связанным
)
search_fields = ('name', 'email') # поиск по этим полям
def status_colored(self, obj):
# Пользовательское отображение
color = 'green' if obj.is_verified else 'red'
status = 'Verified' if obj.is_verified else 'Pending'
return format_html(
'<span style="color: {}">{}</span>',
color,
status
)
status_colored.short_description = 'Verification Status'
admin.site.register(User, UserAdmin)
Кастомные формы
from django import forms
from django.contrib import admin
from .models import User
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = ['name', 'email']
widgets = {
'name': forms.TextInput(attrs={'size': 50}),
'email': forms.EmailInput(attrs={'size': 50})
}
class UserAdmin(admin.ModelAdmin):
form = UserForm
list_display = ('name', 'email')
admin.site.register(User, UserAdmin)
Сохранение истории (История действий)
Django админ автоматически логирует все изменения. Доступна через админ-интерфейс (history):
class UserAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'email')
# История доступна автоматически через кнопку "History"
Пример полноценного админа
from django.contrib import admin
from django.utils.html import format_html
from .models import User, Post
class PostInline(admin.TabularInline):
model = Post
extra = 1
fields = ('title', 'created_at')
readonly_fields = ('created_at',)
def activate_users(modeladmin, request, queryset):
queryset.update(is_active=True)
activate_users.short_description = "Activate selected users"
class UserAdmin(admin.ModelAdmin):
inlines = [PostInline]
list_display = (
'id',
'name',
'email',
'post_count',
'created_at'
)
list_filter = ('created_at', 'is_active')
search_fields = ('name', 'email')
readonly_fields = ('created_at', 'post_count')
actions = [activate_users]
fieldsets = (
('Personal Info', {
'fields': ('name', 'email')
}),
('Status', {
'fields': ('is_active', 'created_at')
})
)
def post_count(self, obj):
return obj.posts.count()
post_count.short_description = 'Posts'
admin.site.register(User, UserAdmin)
Отключение админа для модели
Если не нужен админ для модели:
class MyModel(models.Model):
# ...
class Meta:
permissions = [('special_permission', 'Can do special stuff')]
# админ всё равно будет, но можно ограничить rights
Ключевые возможности
- list_display — колонки в списке
- list_filter — фильтры справа
- search_fields — поиск
- inlines — редактирование связанных объектов
- actions — массовые операции
- readonly_fields — только для чтения
- fieldsets — группировка полей
- permissions — контроль доступа
- История — автоматическое логирование изменений