Django Admin:5 分钟搭建一个全功能的后台管理系统 

0 阅读9分钟

IT策士 10余年一线大厂经验,专注 IT 思维、架构、职场进阶。我会在公众号、今日头条持续发布最新文章,助你少走弯路。

Django Admin 是 Django 框架最具杀伤力的特性之一。你只需要定义好模型,就能免费获得一个功能完善、可深度定制的后台管理系统。无论你是刚接触 Web 开发的新手,还是希望提升后台开发效率的进阶者,Django Admin 都能让你在几分钟内构建出专业的管理界面。本文将从零开始,带你深入浅出地掌握 Django Admin 的核心用法与高级技巧,并通过大量控制台输出和实例,帮你理解背后发生了什么。


一、认识 Django Admin:开箱即用的后台神器

Django Admin 本质上是一个基于模型自动生成的后台 CRUD 界面。它的设计哲学是:“内容发布者的工作界面,不是开发者的调试工具”。你只需告诉 Admin 你需要管理哪些模型,它就会自动生成列表、表单、过滤、搜索、分页等功能。

核心优势:

  • 零前端代码,自动适配模型字段类型。

  • 强大的定制能力:列表显示、过滤器、搜索、自定义动作、内联编辑等。

  • 完善的权限系统,基于用户和组。

  • 所有操作都会记录日志(LogEntry),可追溯。

  • 可通过继承和覆盖模板,实现完全自定义的界面。


二、5 分钟快速上手:从零搭建后台

1. 创建项目和 App

django-admin startproject bookstore
cd bookstore
python manage.py startapp books

'books' 加入 bookstore/settings.pyINSTALLED_APPS 中。

2. 定义模型

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

3. 迁移数据库

运行迁移命令,注意观察控制台输出,它会告诉你创建了哪些表。

$ 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 命令创建一个管理员账号。

$ 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 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.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 = '是否高价'

然后在 BookAdminlist_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_descriptionadmin_order_field 属性。

3. 表单与字段集:打造优雅的编辑页

编辑页面的布局可以通过 fieldsfieldsets 控制。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 中确保 TEMPLATESDIRS 包含项目级模板目录,例如 BASE_DIR / 'templates'

然后创建 templates/admin/base_site.html

{% 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 方法添加路由,并编写视图函数。

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 %}
<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 记录的变化。

$ 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 会立刻报错:

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.save()
        count += 1
    print(f'批量降价完成,共处理{count}本。')
    self.message_user(request, f'已对{count}本书降价10%。')

执行后终端输出:

这在复杂业务逻辑调试中非常有用。


五、总结

Django Admin 远不止一个简单的“自动后台”。从列表定制、过滤器、自定义动作,到内联编辑、模板覆盖、自定义视图,它提供了一套完整的后台解决方案。通过本文你学会了:

  • 5 分钟内搭建全功能后台。

  • 优化列表显示、搜索和过滤。

  • 使用内联简化关联数据管理。

  • 编写批量动作并输出控制台日志。

  • 覆盖模板打造个性化界面。

  • 添加完全自定义的视图页面。

  • 利用控制台输出和 Shell 快速调试。

对于新手,Django Admin 能让你把精力集中在业务逻辑,而不是后台界面的重复开发。对于进阶者,其高度的可扩展性完全可以支撑起复杂的管理需求。只要你愿意深入,它几乎能胜任任何管理后台场景。

现在,打开终端,动手试试吧!

想了解更多:还可以去公众号、今日头条搜索「IT策士」,一起升级 IT 思维 !