← Назад к вопросам

Что такое admin.py в Django?

1.6 Junior🔥 211 комментариев
#Django

Комментарии (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 — контроль доступа
  • История — автоматическое логирование изменений
Что такое admin.py в Django? | PrepBro