Django Admin:5 分钟搭建一个全功能的后台管理系统
IT策士 10余年一线大厂经验专注 IT 思维、架构、职场进阶。Django Admin 是 Django 框架最具杀伤力的特性之一。你只需要定义好模型就能免费获得一个功能完善、可深度定制的后台管理系统。无论你是刚接触 Web 开发的新手还是希望提升后台开发效率的进阶者Django Admin 都能让你在几分钟内构建出专业的管理界面。本文将从零开始带你深入浅出地掌握 Django Admin 的核心用法与高级技巧并通过大量控制台输出和实例帮你理解背后发生了什么。一、认识 Django Admin开箱即用的后台神器Django Admin 本质上是一个基于模型自动生成的后台 CRUD 界面。它的设计哲学是“内容发布者的工作界面不是开发者的调试工具”。你只需告诉 Admin 你需要管理哪些模型它就会自动生成列表、表单、过滤、搜索、分页等功能。核心优势零前端代码自动适配模型字段类型。强大的定制能力列表显示、过滤器、搜索、自定义动作、内联编辑等。完善的权限系统基于用户和组。所有操作都会记录日志LogEntry可追溯。可通过继承和覆盖模板实现完全自定义的界面。二、5 分钟快速上手从零搭建后台1. 创建项目和 Appdjango-admin startproject bookstorecdbookstore python manage.py startapp books将books加入bookstore/settings.py的INSTALLED_APPS中。2. 定义模型在books/models.py中定义作者和书籍模型from django.dbimportmodels class Author(models.Model): namemodels.CharField(max_length100)emailmodels.EmailField(blankTrue)biomodels.TextField(blankTrue)def __str__(self):returnself.name class Book(models.Model): titlemodels.CharField(max_length200)authormodels.ForeignKey(Author,on_deletemodels.CASCADE)pricemodels.DecimalField(max_digits6,decimal_places2)published_datemodels.DateField(nullTrue,blankTrue)is_publishedmodels.BooleanField(defaultFalse)def __str__(self):returnself.title3. 迁移数据库运行迁移命令注意观察控制台输出它会告诉你创建了哪些表。$ python manage.py makemigrations books Migrationsforbooks: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... OK4. 创建超级用户Admin 需要登录我们用createsuperuser命令创建一个管理员账号。$ python manage.py createsuperuser Username(leave blank to useyour-os-username): admin Email address: adminexample.com Password: Password(again): Superuser created successfully.5. 注册模型到 Admin在books/admin.py中注册模型from django.contribimportadmin from .modelsimportAuthor, Book admin.site.register(Author)admin.site.register(Book)6. 启动开发服务器$ python manage.py runserver Watchingforfilechanges with StatReloader Performing system checks... System check identified no issues(0silenced). May14,2026-10:05:21 Django version4.2, using settingsbookstore.settingsStarting 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类from django.contribimportadmin from .modelsimportAuthor, Book class BookAdmin(admin.ModelAdmin):# 列表页显示的字段list_display(title,author,price,published_date,is_published)# 右侧过滤栏list_filter(is_published,author)# 搜索框可搜索 title 和 author__namesearch_fields(title,author__name)# 默认排序ordering(-published_date,)# 每页显示条数list_per_page20admin.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):returnself.price50is_expensive.booleanTrue# 显示为勾叉图标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作者邮箱,orderingauthor__email)def author_email(self, obj):returnobj.author.emailadmin.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.StackedInlinemodelBook extra1# 默认多显示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): updatedqueryset.update(is_publishedTrue)# 这行信息会在 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{% extendsadmin/base_site.html%}{% block title %}小书店后台管理系统{% endblock %}{% block branding %}h1idsite-nameahref{% url admin:index %} 小书店管理/a/h1{% endblock %}重启服务器登录页和后台顶部的标题就变成你设置的内容了。7. 添加自定义视图突破 CRUD 限制你可以在 Admin 中完全自定义一个页面例如销售报表。通过get_urls方法添加路由并编写视图函数。from django.urlsimportpath from django.shortcutsimportrender from django.contribimportadmin class BookAdmin(admin.ModelAdmin):# ... 其他配置 ...def get_urls(self): urlssuper().get_urls()custom_urls[path(report/, self.admin_site.admin_view(self.report_view),namebook-report),]returncustom_urls urls def report_view(self, request):# 简单的统计total_booksBook.objects.count()total_publishedBook.objects.filter(is_publishedTrue).count()contextdict(self.admin_site.each_context(request),total_bookstotal_books,total_publishedtotal_published,)returnrender(request,admin/book_report.html, context)接着创建模板templates/admin/book_report.html{% extendsadmin/base_site.html%}{% block content %}h2书籍销售报告/h2ulli总书籍数{{total_books}}/lili已发布数{{total_published}}/li/ul{% endblock %}现在访问http://127.0.0.1:8000/admin/books/book/report/就能看到自定义报告页。你可以在后台侧边栏或动作中添加入口链接。四、控制台与调试输出了解背后的运作新手常常只关注浏览器界面但了解命令行的反馈对于排查问题和理解流程至关重要。这里集中展示几个常用场景的控制台输出。1. Django Shell 查询示例进入交互式 Shell直接操作模型观察 Admin 记录的变化。$ python manage.py shellfrom books.modelsimportAuthor, Bookfrom django.contrib.admin.modelsimportLogEntryauthorAuthor.objects.create(nameJ.K. Rowling,emailjkexample.com)bookBook.objects.create(titleHarry Potter,authorauthor,price39.99,is_publishedTrue)# 查看 admin 日志logsLogEntry.objects.filter(content_type__modelbook).values(action_time,object_repr,action_flag,change_message)forloginlogs:... print(log)...{action_time:datetime.datetime(2026,5,14,10,15,42,123456,tzinfodatetime.timezone.utc),object_repr:Harry Potter,action_flag:1,change_message:[{added: {}}]}action_flag中 1 表示添加2 表示修改3 表示删除。Admin 的每一次操作都被默默记录方便审计。2. 服务器控制台的错误与打印当你遇到 500 错误时控制台会输出完整的 Traceback帮助你快速定位问题。例如如果你在list_display中写错了字段名runserver会立刻报错AttributeError: Unable to lookupnonexistent_fieldon Book or BookAdmin正是这些即时的反馈让开发体验非常高效。3. 调试动作的即时打印前面我们在动作中加了print每次执行动作都会输出到终端。你可以利用这个特性在开发阶段观察动作是否触发、处理了多少数据。admin.action(description降价10%)def discount_price(self, request, queryset): count0forbookinqueryset: book.pricebook.price *0.9book.save()count1print(f批量降价完成共处理{count}本。)self.message_user(request, f已对{count}本书降价10%。)执行后终端输出这在复杂业务逻辑调试中非常有用。五、总结Django Admin 远不止一个简单的“自动后台”。从列表定制、过滤器、自定义动作到内联编辑、模板覆盖、自定义视图它提供了一套完整的后台解决方案。通过本文你学会了5 分钟内搭建全功能后台。优化列表显示、搜索和过滤。使用内联简化关联数据管理。编写批量动作并输出控制台日志。覆盖模板打造个性化界面。添加完全自定义的视图页面。利用控制台输出和 Shell 快速调试。对于新手Django Admin 能让你把精力集中在业务逻辑而不是后台界面的重复开发。对于进阶者其高度的可扩展性完全可以支撑起复杂的管理需求。只要你愿意深入它几乎能胜任任何管理后台场景。现在打开终端动手试试吧想了解更多还可以去公众号、今日头条搜索「IT策士」一起升级 IT 思维