pin_drop当前位置:知识文库 ❯ 图文

Django Admin后台详解 - 从零搭建管理系统完整教程

一、Admin后台概述

Django Admin是内置的后台管理系统,自动为注册的Model生成增删改查界面。只需几行代码即可拥有功能完善的管理后台,支持列表展示、搜索、筛选、排序、批量操作等。

Admin是Django最强大的特性之一,大幅减少了后台管理系统的开发工作量。通过admin.py文件配置ModelAdmin类,可以自定义后台界面的展示和行为。


二、ModelAdmin常用属性

属性 类型 说明
list_display list 列表页显示的字段或方法名
list_filter list 侧边栏筛选器字段
search_fields list 搜索框搜索的字段
list_per_page int 列表页每页显示数量
ordering list 默认排序字段(-表示降序)
readonly_fields list 只读字段(不可编辑)
fieldsets list 编辑页字段分组配置
inlines list 内联编辑配置
actions list 自定义批量操作
date_hierarchy str 日期层级导航字段
prepopulated_fields dict 自动填充字段(如slug)
list_editable list 列表页可直接编辑的字段

注册方式

方式 代码 说明
简单注册 admin.site.register(Model) 默认配置,无自定义
装饰器 @admin.register(Model) 推荐方式,代码更简洁
显式注册 admin.site.register(Model, Admin) 传统方式

三、基本Admin注册

代码示例

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

# 简单注册
admin.site.register(Tag)

# 使用装饰器自定义Admin
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ['title', 'category', 'status', 'views', 'created_at']
    list_filter = ['status', 'category', 'created_at']
    search_fields = ['title', 'content']
    date_hierarchy = 'created_at'
    list_per_page = 20
    ordering = ['-created_at']
    list_editable = ['status']

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = ['name', 'article_count']
    search_fields = ['name']

    def article_count(self, obj):
        return obj.posts.count()
    article_count.short_description = '文章数量'

四、字段分组与内联编辑

字段分组(fieldsets)

fieldsets用于将编辑页的字段分组显示,使界面更加清晰有序:

代码示例

from django.contrib import admin
from .models import Article, Comment

class CommentInline(admin.TabularInline):
    """评论内联编辑"""
    model = Comment
    extra = 1
    readonly_fields = ['created_at']

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ['title', 'status', 'created_at']

    fieldsets = (
        ('基本信息', {
            'fields': ('title', 'category', 'tags')
        }),
        ('内容', {
            'fields': ('content',),
            'classes': ('wide',)
        }),
        ('发布设置', {
            'fields': ('status', 'views'),
            'classes': ('collapse',)  # 可折叠
        }),
    )

    inlines = [CommentInline]
    filter_horizontal = ['tags']  # 多对多字段水平过滤器

五、自定义批量操作

通过actions属性可以自定义批量操作,在列表页勾选多条记录后执行:

代码示例

from django.contrib import admin
from .models import Article

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ['title', 'status', 'created_at']
    actions = ['publish_articles', 'draft_articles']

    @admin.action(description='发布选中的文章')
    def publish_articles(self, request, queryset):
        updated = queryset.update(status='published')
        self.message_user(request, f'成功发布 {updated} 篇文章')

    @admin.action(description='设为草稿')
    def draft_articles(self, request, queryset):
        updated = queryset.update(status='draft')
        self.message_user(request, f'已将 {updated} 篇文章设为草稿')

六、内联类型对比

类型 显示方式
TabularInline admin.TabularInline 表格形式,紧凑,适合少量字段
StackedInline admin.StackedInline 堆叠形式,完整,适合多字段

七、注意事项与最佳实践

注意:使用Admin前需执行 python manage.py migratecreatesuperuser 创建数据库表和管理员账户。

注意:Admin默认只显示 __str__ 方法返回的内容,需要配置 list_display 才能显示更多字段。

注意fieldsetsfields / exclude 不能同时使用,会引发配置冲突。

注意:生产环境应限制Admin的访问权限,可以通过IP白名单、自定义中间件或django-admin-env-guard等工具加强安全防护。

小贴士

使用 @admin.register(Model) 装饰器替代传统的 admin.site.register() 方式,代码更加简洁直观,也更容易阅读。


八、练习题

练习一

为一个Book模型(包含title、author、isbn、publish_date、price字段)创建Admin配置,包含列表展示、搜索(按书名和作者)、筛选(按作者)、日期层级导航。

练习二

创建一个Admin配置,使用fieldsets将字段分为"基本信息"和"详细信息"两组,并添加一个自定义批量操作:将选中的记录标记为"已审核"状态。

常见问题

如何创建Admin管理员账户?

执行命令 python manage.py createsuperuser,然后按提示输入用户名、邮箱和密码。确保已执行 migrate 命令创建数据库表。

如何在Admin中显示外键关联对象的属性?

在list_display中使用双下划线语法:list_display = ['title', 'category__name']。或者在ModelAdmin中定义方法,通过obj.category.name获取。

Admin访问速度慢怎么办?

使用 select_related() 和 prefetch_related() 优化查询:def get_queryset(self): return super().get_queryset().select_related('category')。避免在list_display中使用会触发N+1查询的方法。

如何自定义Admin的样式和主题?

可以覆盖 admin/base_site.html 模板来自定义标题和样式。也可以使用第三方包如 django-jet、django-grappelli、django-unfold 等提供更现代化的Admin界面。

如何限制Admin的访问权限?

可以通过重写 ModelAdmin 的 has_module_permissions() 和 has_model_permissions() 方法控制权限。也可以使用 django-admin-restrict-ip 等第三方包限制IP访问。

标签: Django Admin后台 ModelAdmin 管理后台 批量操作 内联编辑 Python

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Django Form表单详解 - 数据验证与ModelForm完整教程 下一篇: Django中间件详解 - 请求响应钩子系统完整指南

poll相关推荐