Комментарии (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 предоставляет мощный и гибкий механизм кастомизации для разных сценариев.