Chapter 07

Django Admin 后台

Django 的杀手锏:注册模型即得一套功能完整的后台管理系统。本章带你把它从「能用」调到「好用」。

7.1 Admin 是什么

Django Admin 是内置的数据库后台管理界面,自动为已注册模型生成增删改查页面、列表筛选、搜索、权限控制。运营人员无需你写一行 CRUD 页面就能管理内容——这是 Django「自带电池」最耀眼的一颗。

admin.site.register
把模型注册到后台的最简方式,注册后即出现在 Admin 首页的模型列表中。
ModelAdmin
定制某模型后台行为的配置类,控制列表列、筛选器、搜索、表单布局等。
list_display
列表页显示哪些字段(列)。可放模型字段、方法返回值或可调用对象。
list_filter
列表页右侧的筛选侧栏,按指定字段(布尔、外键、日期)快速过滤。
search_fields
启用列表页顶部搜索框,指定按哪些字段做模糊搜索。
Inline(内联)
在父对象编辑页内嵌编辑关联子对象,如在文章页直接编辑其评论。分 TabularInline/StackedInline
list_editable
允许在列表页直接编辑某些字段,无需进入详情页,适合批量改状态。

7.2 最简注册

# blog/admin.py
from django.contrib import admin
from .models import Post, Category

admin.site.register(Post)
admin.site.register(Category)

访问 /admin/ 登录后即可管理 Post 与 Category——增删改查全都有了。

7.3 用 ModelAdmin 定制

from django.contrib import admin
from .models import Post

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ("title", "category", "published", "views", "created")
    list_filter = ("published", "category", "created")
    search_fields = ("title", "body")
    list_editable = ("published",)
    date_hierarchy = "created"
    ordering = ("-created",)
    prepopulated_fields = {"slug": ("title",)}
    list_per_page = 20
@admin.register 装饰器

admin.site.register(Post, PostAdmin) 更简洁:直接把 ModelAdmin 类和模型绑定。推荐统一用装饰器写法。

7.4 自定义列与操作

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ("title", "hot")

    @admin.display(description="热度", boolean=True)
    def hot(self, obj):
        return obj.views > 100

    # 批量动作:一键发布
    actions = ["make_published"]

    @admin.action(description="发布所选文章")
    def make_published(self, request, queryset):
        queryset.update(published=True)

7.5 Inline 内联编辑

from .models import Comment

class CommentInline(admin.TabularInline):
    model = Comment
    extra = 1

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    inlines = [CommentInline]     # 文章页内直接管理评论

7.6 表单布局:fieldsets

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    fieldsets = (
        ("基本信息", {"fields": ("title", "category")}),
        ("内容", {"fields": ("body",)}),
        ("状态", {"fields": ("published",), "classes": ("collapse",)}),
    )
    readonly_fields = ("views", "created")

7.7 权限与后台美化

Admin 与认证系统深度集成:staff 用户才能登录,superuser 拥有全部权限,普通职员可按模型授予 add/change/delete/view 权限。

配置作用
admin.site.site_header后台顶部标题
admin.site.site_title浏览器标签标题
admin.site.index_title首页标题
has_add/change_permission动态控制权限
# 换个更专业的第三方后台皮肤(可选)
$ pip install django-jazzmin
# INSTALLED_APPS 里放到 admin 之前
Admin 是内部工具

Admin 面向可信的运营/管理员,不是面向终端用户的界面。别把它当作产品前台暴露给公众;面向用户的操作应走自己的视图与表单。

7.8 小结与下一步