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

Как зарегистрировать модель в админке?

1.0 Junior🔥 241 комментариев
#Django

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как зарегистрировать модель в админке

В Django admin (и аналогичных системах администраторских панелей) нужно зарегистрировать модель, чтобы она отображалась в интерфейсе и её можно было редактировать. Это делается несколькими способами в зависимости от используемого фреймворка.

Django Admin (самый распространённый)

Базовая регистрация модели

# myapp/models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    published_date = models.DateField()
    pages = models.IntegerField()
    
    class Meta:
        app_label = 'myapp'
    
    def __str__(self):
        return self.title

Регистрация в admin.py

# myapp/admin.py
from django.contrib import admin
from .models import Book

# Простейшая регистрация
admin.site.register(Book)

Теперь модель Book отображается в Django admin с базовым функционалом:

  • Список всех книг
  • Редактирование существующих
  • Добавление новых
  • Удаление

Кастомизация с ModelAdmin

# myapp/admin.py
from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    # Поля для отображения в списке
    list_display = ('title', 'author', 'published_date', 'pages')
    
    # Поля для фильтрации
    list_filter = ('published_date', 'author')
    
    # Поле для поиска
    search_fields = ('title', 'author')
    
    # Поля при редактировании
    fields = ('title', 'author', 'published_date', 'pages')
    
    # Сортировка по умолчанию
    ordering = ('-published_date',)
    
    # Количество элементов на странице
    list_per_page = 20
    
    # Действия (массовые операции)
    actions = ['mark_as_published']
    
    def mark_as_published(self, request, queryset):
        queryset.update(status='published')
    mark_as_published.short_description = 'Отметить как опубликовано'

# Регистрация с кастомным админом
admin.site.register(Book, BookAdmin)

Более сложная кастомизация

from django.contrib import admin
from django.utils.html import format_html
from .models import Book, Author

class AuthorAdmin(admin.ModelAdmin):
    list_display = ('name', 'book_count', 'created_at')
    
    def book_count(self, obj):
        return obj.books.count()
    book_count.short_description = 'Количество книг'

class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'colored_status', 'pages')
    list_filter = ('author', 'published_date')
    search_fields = ('title', 'author__name')
    
    # Группировка полей
    fieldsets = (
        ('Основная информация', {
            'fields': ('title', 'author')
        }),
        ('Детали', {
            'fields': ('published_date', 'pages'),
            'classes': ('collapse',)  # Свернуть по умолчанию
        }),
    )
    
    # Метод для цветного отображения
    def colored_status(self, obj):
        if obj.pages > 500:
            color = 'red'
            status = 'Толстая'
        elif obj.pages > 200:
            color = 'orange'
            status = 'Средняя'
        else:
            color = 'green'
            status = 'Тонкая'
        return format_html(
            '<span style="color: {};">{}</span>',
            color,
            status
        )
    colored_status.short_description = 'Размер'
    
    # Только чтение для некоторых полей
    readonly_fields = ('created_at',)
    
    # Действие при сохранении
    def save_model(self, request, obj, form, change):
        if not change:  # Если создание новой книги
            obj.created_by = request.user
        super().save_model(request, obj, form, change)

admin.site.register(Author, AuthorAdmin)
admin.site.register(Book, BookAdmin)

Inline редактирование (связанные модели)

from django.contrib import admin
from .models import Author, Book

class BookInline(admin.TabularInline):
    model = Book
    extra = 1  # Количество пустых форм для добавления
    fields = ('title', 'published_date', 'pages')

class AuthorAdmin(admin.ModelAdmin):
    list_display = ('name', 'created_at')
    inlines = [BookInline]  # Редактировать книги внутри автора

admin.site.register(Author, AuthorAdmin)

Теперь при редактировании автора можно добавлять/редактировать его книги прямо там же.

Права доступа

class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author')
    
    def get_queryset(self, request):
        queryset = super().get_queryset(request)
        # Обычные пользователи видят только свои книги
        if not request.user.is_superuser:
            queryset = queryset.filter(author=request.user)
        return queryset
    
    def has_delete_permission(self, request, obj=None):
        # Только суперпользователь может удалять
        return request.user.is_superuser
    
    def has_change_permission(self, request, obj=None):
        # Разрешить редактирование только создателю
        if obj and request.user != obj.created_by:
            return False
        return request.user.is_staff

admin.site.register(Book, BookAdmin)

SQLAlchemy + SQLAdmin

Для FastAPI/SQLAlchemy используется SQLAdmin:

from sqladmin import Admin, ModelView
from fastapi import FastAPI
from sqlalchemy import create_engine

app = FastAPI()
engine = create_engine('sqlite:///./test.db')
admin = Admin(app, engine)

class BookAdmin(ModelView, model=Book):
    # Поля для отображения в списке
    column_list = [Book.id, Book.title, Book.author, Book.pages]
    
    # Поля для фильтрации
    column_filters = ['author', 'published_date']
    
    # Поле для поиска
    name_plural = 'Books'
    icon = 'fa-solid fa-book'

admin.register_model(BookAdmin)

Пример полного решения

# models.py
from django.db import models
from django.contrib.auth.models import User

class Category(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(unique=True)
    
    def __str__(self):
        return self.name

class Product(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    stock = models.IntegerField()
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return self.name

# admin.py
from django.contrib import admin
from .models import Category, Product

class ProductInline(admin.StackedInline):
    model = Product
    extra = 1
    fields = ('name', 'price', 'stock', 'is_active')

class CategoryAdmin(admin.ModelAdmin):
    list_display = ('name', 'slug', 'product_count')
    prepopulated_fields = {'slug': ('name',)}
    inlines = [ProductInline]
    
    def product_count(self, obj):
        return obj.product_set.count()
    product_count.short_description = 'Количество товаров'

class ProductAdmin(admin.ModelAdmin):
    list_display = ('name', 'category', 'price', 'stock', 'is_active', 'created_at')
    list_filter = ('category', 'is_active', 'created_at')
    search_fields = ('name', 'description')
    readonly_fields = ('created_at',)
    
    fieldsets = (
        ('Основное', {
            'fields': ('name', 'category', 'description')
        }),
        ('Цена и наличие', {
            'fields': ('price', 'stock')
        }),
        ('Статус', {
            'fields': ('is_active', 'created_at')
        }),
    )
    
    actions = ['make_active', 'make_inactive']
    
    def make_active(self, request, queryset):
        queryset.update(is_active=True)
    make_active.short_description = 'Активировать выбранные товары'
    
    def make_inactive(self, request, queryset):
        queryset.update(is_active=False)
    make_inactive.short_description = 'Деактивировать выбранные товары'

admin.site.register(Category, CategoryAdmin)
admin.site.register(Product, ProductAdmin)

В заключение: регистрация модели в админке позволяет управлять данными без написания собственного интерфейса. Django admin предоставляет мощный и гибкий механизм кастомизации для разных сценариев.