IT策士 10余年一线大厂经验,专注 IT 思维、架构、职场进阶。我会在公众号、今日头条持续发布最新文章,助你少走弯路。
Django Admin 是 Django 框架最具杀伤力的特性之一。你只需要定义好模型,就能免费获得一个功能完善、可深度定制的后台管理系统。无论你是刚接触 Web 开发的新手,还是希望提升后台开发效率的进阶者,Django Admin 都能让你在几分钟内构建出专业的管理界面。本文将从零开始,带你深入浅出地掌握 Django Admin 的核心用法与高级技巧,并通过大量控制台输出和实例,帮你理解背后发生了什么。
一、认识 Django Admin:开箱即用的后台神器
Django Admin 本质上是一个基于模型自动生成的后台 CRUD 界面。它的设计哲学是:"内容发布者的工作界面,不是开发者的调试工具"。你只需告诉 Admin 你需要管理哪些模型,它就会自动生成列表、表单、过滤、搜索、分页等功能。
核心优势:
-
零前端代码,自动适配模型字段类型。
-
强大的定制能力:列表显示、过滤器、搜索、自定义动作、内联编辑等。
-
完善的权限系统,基于用户和组。
-
所有操作都会记录日志(LogEntry),可追溯。
-
可通过继承和覆盖模板,实现完全自定义的界面。
二、5 分钟快速上手:从零搭建后台
1. 创建项目和 App
bash
django-admin startproject bookstore
cd bookstore
python manage.py startapp books
将 'books' 加入 bookstore/settings.py 的 INSTALLED_APPS 中。
2. 定义模型
在 books/models.py 中定义作者和书籍模型:
bash
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(blank=True)
bio = models.TextField(blank=True)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
price = models.DecimalField(max_digits=6, decimal_places=2)
published_date = models.DateField(null=True, blank=True)
is_published = models.BooleanField(default=False)
def __str__(self):
return self.title
3. 迁移数据库
运行迁移命令,注意观察控制台输出,它会告诉你创建了哪些表。
bash
$ python manage.py makemigrations books
Migrations for 'books':
books/migrations/0001_initial.py
- Create model Author
- Create model Book
$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, books, contenttypes, sessions
Running migrations:
Applying books.0001_initial... OK
4. 创建超级用户
Admin 需要登录,我们用 createsuperuser 命令创建一个管理员账号。
bash
$ python manage.py createsuperuser
Username (leave blank to use 'your-os-username'): admin
Email address: admin@example.com
Password:
Password (again):
Superuser created successfully.
5. 注册模型到 Admin
在 books/admin.py 中注册模型:
bash
from django.contrib import admin
from .models import Author, Book
admin.site.register(Author)
admin.site.register(Book)
6. 启动开发服务器
bash
$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
May 14, 2026 - 10:05:21
Django version 4.2, using settings 'bookstore.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
打开浏览器访问 http://127.0.0.1:8000/admin/,用刚才创建的超级用户登录,你立刻就能看到 Authors 和 Books 两个模型的管理界面。点击进入,可以自由地增删改查。不到 5 分钟,一个全功能后台就诞生了。
三、定制你的 Admin 面板:从小白到进阶
默认界面虽然能用,但通常需要根据业务需求进行定制。Django Admin 提供了极其丰富的配置选项,所有定制都围绕 ModelAdmin 类展开。
1. 基础列表定制:让数据一目了然
修改 books/admin.py,为 Book 创建一个 ModelAdmin 类:
bash
from django.contrib import admin
from .models import Author, Book
class BookAdmin(admin.ModelAdmin):
# 列表页显示的字段
list_display = ('title', 'author', 'price', 'published_date', 'is_published')
# 右侧过滤栏
list_filter = ('is_published', 'author')
# 搜索框,可搜索 title 和 author__name
search_fields = ('title', 'author__name')
# 默认排序
ordering = ('-published_date',)
# 每页显示条数
list_per_page = 20
admin.site.register(Book, BookAdmin)
admin.site.register(Author)
刷新后台书籍列表页,你会看到:
-
表格显示了指定的列。
-
右侧出现了按"发布状态"和"作者"过滤的面板。
-
顶部搜索框可以输入书名或作者名进行检索。
-
数据按发布日期倒序排列。
2. 添加自定义列:超越字段本身
list_display 不仅能放模型字段,还可以放模型方法或 ModelAdmin 自身的方法。我们想显示一本书的价格是否大于 50 元(例如标记"高价")。
在 Book 模型中添加方法(或在 BookAdmin 中定义):
bash
# 在 models.py 的 Book 类中
class Book(models.Model):
# ... 字段省略 ...
def is_expensive(self):
return self.price > 50
is_expensive.boolean = True # 显示为勾叉图标
is_expensive.short_description = '是否高价'
然后在 BookAdmin 的 list_display 中加入 'is_expensive'。刷新页面,你会看到一列漂亮的图标。
如果想基于关联模型的数据生成列,比如显示作者邮箱,可以在 BookAdmin 中定义一个方法:
bash
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'author_email', 'price', 'is_published')
@admin.display(description='作者邮箱', ordering='author__email')
def author_email(self, obj):
return obj.author.email
@admin.display 装饰器是 Django 3.2+ 的推荐写法,等价于设置 short_description 和 admin_order_field 属性。
3. 表单与字段集:打造优雅的编辑页
编辑页面的布局可以通过 fields 或 fieldsets 控制。fieldsets 能将字段分组,并支持折叠。
bash
class BookAdmin(admin.ModelAdmin):
# ... 列表配置省略 ...
fieldsets = (
('基本信息', {
'fields': ('title', 'author', 'price')
}),
('出版信息', {
'fields': ('published_date', 'is_published'),
'classes': ('collapse',) # 默认折叠
}),
)
readonly_fields = ('price',) # 某些字段只读
进入编辑页面,你会看到价格变为只读,出版信息部分默认折叠,点击可展开。
4. 内联模型(InlineModelAdmin):编辑关联对象
如果想在编辑作者时同时管理他的所有书籍,可以使用内联。在 admin.py 中创建 BookInline,然后把它加到 AuthorAdmin 中。
bash
class BookInline(admin.TabularInline): # 或 admin.StackedInline
model = Book
extra = 1 # 默认多显示1行空白表单
fields = ('title', 'price', 'is_published')
class AuthorAdmin(admin.ModelAdmin):
list_display = ('name', 'email')
inlines = [BookInline]
admin.site.register(Author, AuthorAdmin)
现在打开某个作者,他的所有书籍会以表格形式内联显示在下方,可以直接增删改。
5. 自定义 Actions:批量处理数据
Admin 中的"动作"允许你对选中的对象执行批量操作。Django 默认提供了一个"删除选中项"的动作。我们来实现一个"批量发布"的动作,并在控制台打印处理结果。
bash
class BookAdmin(admin.ModelAdmin):
# ... 其他配置 ...
actions = ['make_published']
@admin.action(description='将选中的书籍设为已发布')
def make_published(self, request, queryset):
updated = queryset.update(is_published=True)
# 这行信息会在 runserver 的控制台输出
print(f'[INFO] 用户 {request.user} 批量发布了 {updated} 本书籍。')
self.message_user(request, f'成功发布了 {updated} 本书籍。')
在书籍列表页,勾选几本书,选择"将选中的书籍设为已发布"动作,点击执行。Django 界面顶部会出现成功消息,同时你的 runserver 终端会打印类似:
bash
[INFO] 用户 admin 批量发布了 3 本书籍。
这个 print 在开发调试时很有用。实际项目中你也可以写日志。
6. 改写模板:让后台改头换面
如果你觉得默认标题"Django 管理"不够酷,可以覆盖模板。只需在项目模板目录下创建对应的文件。
首先,在 bookstore/settings.py 中确保 TEMPLATES 的 DIRS 包含项目级模板目录,例如 BASE_DIR / 'templates'。
然后创建 templates/admin/base_site.html:
bash
{% extends "admin/base_site.html" %}
{% block title %}小书店后台管理系统{% endblock %}
{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">📚 小书店管理</a></h1>
{% endblock %}
重启服务器,登录页和后台顶部的标题就变成你设置的内容了。
7. 添加自定义视图:突破 CRUD 限制
你可以在 Admin 中完全自定义一个页面,例如销售报表。通过 get_urls 方法添加路由,并编写视图函数。
bash
from django.urls import path
from django.shortcuts import render
from django.contrib import admin
class BookAdmin(admin.ModelAdmin):
# ... 其他配置 ...
def get_urls(self):
urls = super().get_urls()
custom_urls = [
path('report/', self.admin_site.admin_view(self.report_view), name='book-report'),
]
return custom_urls + urls
def report_view(self, request):
# 简单的统计
total_books = Book.objects.count()
total_published = Book.objects.filter(is_published=True).count()
context = dict(
self.admin_site.each_context(request),
total_books=total_books,
total_published=total_published,
)
return render(request, 'admin/book_report.html', context)
接着创建模板 templates/admin/book_report.html:
bash
{% extends "admin/base_site.html" %}
{% block content %}
<h2>书籍销售报告</h2>
<ul>
<li>总书籍数:{{ total_books }}</li>
<li>已发布数:{{ total_published }}</li>
</ul>
{% endblock %}
现在访问 http://127.0.0.1:8000/admin/books/book/report/ 就能看到自定义报告页。你可以在后台侧边栏或动作中添加入口链接。
四、控制台与调试输出:了解背后的运作
新手常常只关注浏览器界面,但了解命令行的反馈对于排查问题和理解流程至关重要。这里集中展示几个常用场景的控制台输出。
1. Django Shell 查询示例
进入交互式 Shell,直接操作模型,观察 Admin 记录的变化。
bash
$ python manage.py shell
>>> from books.models import Author, Book
>>> from django.contrib.admin.models import LogEntry
>>> author = Author.objects.create(name='J.K. Rowling', email='jk@example.com')
>>> book = Book.objects.create(title='Harry Potter', author=author, price=39.99, is_published=True)
>>> # 查看 admin 日志
>>> logs = LogEntry.objects.filter(content_type__model='book').values('action_time', 'object_repr', 'action_flag', 'change_message')
>>> for log in logs:
... print(log)
...
{'action_time': datetime.datetime(2026, 5, 14, 10, 15, 42, 123456, tzinfo=datetime.timezone.utc),
'object_repr': 'Harry Potter', 'action_flag': 1, 'change_message': '[{"added": {}}]'}
action_flag 中 1 表示添加,2 表示修改,3 表示删除。Admin 的每一次操作都被默默记录,方便审计。
2. 服务器控制台的错误与打印
当你遇到 500 错误时,控制台会输出完整的 Traceback,帮助你快速定位问题。例如,如果你在 list_display 中写错了字段名,runserver 会立刻报错:
bash
AttributeError: Unable to lookup 'nonexistent_field' on Book or BookAdmin
正是这些即时的反馈,让开发体验非常高效。
3. 调试动作的即时打印
前面我们在动作中加了 print,每次执行动作都会输出到终端。你可以利用这个特性在开发阶段观察动作是否触发、处理了多少数据。
bash
@admin.action(description='降价10%')
def discount_price(self, request, queryset):
count = 0
for book in queryset:
book.price = book.price * 0.9
book.save()
count += 1
print(f'批量降价完成,共处理{count}本。')
self.message_user(request, f'已对{count}本书降价10%。')
执行后终端输出:
这在复杂业务逻辑调试中非常有用。
五、总结
Django Admin 远不止一个简单的"自动后台"。从列表定制、过滤器、自定义动作,到内联编辑、模板覆盖、自定义视图,它提供了一套完整的后台解决方案。通过本文你学会了:
-
5 分钟内搭建全功能后台。
-
优化列表显示、搜索和过滤。
-
使用内联简化关联数据管理。
-
编写批量动作并输出控制台日志。
-
覆盖模板打造个性化界面。
-
添加完全自定义的视图页面。
-
利用控制台输出和 Shell 快速调试。
对于新手,Django Admin 能让你把精力集中在业务逻辑,而不是后台界面的重复开发。对于进阶者,其高度的可扩展性完全可以支撑起复杂的管理需求。只要你愿意深入,它几乎能胜任任何管理后台场景。
现在,打开终端,动手试试吧!
想了解更多:还可以去公众号、今日头条搜索「IT策士」,一起升级 IT 思维 !