IT策士 10余年一线大厂经验,专注 IT 思维、架构、职场进阶。我会在公众号、今日头条持续发布最新文章,助你少走弯路。
Django Admin 是 Django 框架最具杀伤力的特性之一。你只需要定义好模型,无论你是刚接触 Web 开发的新手,还是希望提升后台开发效率的进阶者,Django Admin 都能让你在几分钟内构建出专业的管理界面。本文将从零开始,带你深入浅出地掌握 Django Admin 的核心用法与高级技巧,并通过大量控制台输出和实例,帮你理解背后发生了什么。
一、认识 Django Admin:开箱即用的后台神器
它的设计哲学是: “内容发布者的工作界面,不是开发者的调试工具” 。你只需告诉 Admin 你需要管理哪些模型,
零前端代码,自动适配模型字段类型。
强大的定制能力:列表显示、过滤器、搜索、自定义动作、内联编辑等。
所有操作都会记录日志(LogEntry),可追溯。
二、5 分钟快速上手:从零搭建后台
1. 创建项目和 App django-admin startproject bookstore cd bookstore python manage.py startapp books
将 'books' 加入 bookstore/settings.py 的 INSTALLED_APPS 中。
在 books/models.py 中定义作者和书籍模型: 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
运行迁移命令,注意观察控制台输出,它会告诉你创建了哪些表。 $ 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
Admin 需要登录,我们用 createsuperuser 命令创建一个管理员账号。 $ 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 中注册模型: from django.contrib import admin from .models import Author, Book admin.site.register(Author) admin.site.register(Book)
6. 启动开发服务器 $ 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 Quit the server with CONTROL-C.
三、定制你的 Admin 面板:从小白到进阶
默认界面虽然能用,但通常需要根据业务需求进行定制。Django Admin 提供了极其丰富的配置选项,所有定制都围绕 ModelAdmin 类展开。
1. 基础列表定制:让数据一目了然
修改 books/admin.py,为 Book 创建一个 ModelAdmin 类: 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 中定义): # 在 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 中定义一个方法: 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 能将字段分组,并支持折叠。 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 中。 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 默认提供了一个“删除选中项”的动作。我们来实现一个“批量发布”的动作,并在控制台打印处理结果。 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 终端会打印类似: [INFO] 用户 admin 批量发布了 3 本书籍。
这个 print 在开发调试时很有用。实际项目中你也可以写日志。
6. 改写模板:让后台改头换面
如果你觉得默认标题“Django 管理”不够酷,可以覆盖模板。只需在项目模板目录下创建对应的文件。
首先,在 bookstore/settings.py 中确保 TEMPLATES 的 DIRS 包含项目级模板目录,例如 BASE_DIR / 'templates'。
然后创建 templates/admin/base_site.html: {% extends "admin/base_site.html" %} {% block title %}小书店后台管理系统{% endblock %} {% block branding %}
小书店管理
{% endblock %}重启服务器,登录页和后台顶部的标题就变成你设置的内容了。
7. 添加自定义视图:突破 CRUD 限制 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: {% extends "admin/base_site.html" %} {% block content %}
书籍销售报告
- 总书籍数:{{ total_books }}
- 已发布数:{{ total_published }}
现在访问 就能看到自定义报告页。你可以在后台侧边栏或动作中添加入口链接。
四、控制台与调试输出:了解背后的运作
1. Django Shell 查询示例
进入交互式 Shell,直接操作模型,观察 Admin 记录的变化。 $ 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 错误时,帮助你快速定位问题。例如,如果你在 list_display 中写错了字段名,runserver 会立刻报错: AttributeError: Unable to lookup 'nonexistent_field' on Book or BookAdmin
正是这些即时的反馈,让开发体验非常高效。
3. 调试动作的即时打印
前面我们在动作中加了 print,每次执行动作都会输出到终端。你可以利用这个特性在开发阶段观察动作是否触发、处理了多少数据。 @admin.action(description='降价10%') def discount_price(self, request, queryset): count = 0 for book in queryset: book.price = book.price * 0.9 book.共处理{count}本。') self.message_user(request, f'已对{count}本书降价10%。')
这在复杂业务逻辑调试中非常有用。
Django Admin 远不止一个简单的“自动后台”。从列表定制、过滤器、自定义动作,到内联编辑、模板覆盖、自定义视图,通过本文你学会了:
5 分钟内搭建全功能后台。
优化列表显示、搜索和过滤。
使用内联简化关联数据管理。
编写批量动作并输出控制台日志。
覆盖模板打造个性化界面。
利用控制台输出和 Shell 快速调试。
对于新手,Django Admin 能让你把精力集中在业务逻辑,而不是后台界面的重复开发。对于进阶者,只要你愿意深入,它几乎能胜任任何管理后台场景。
现在,打开终端,动手试试吧!
想了解更多:还可以去公众号、今日头条搜索「IT策士」,一起升级 IT 思维 !
全部评论