pin_drop当前位置:知识文库 ❯ 图文
Django Admin后台详解 - 从零搭建管理系统完整教程
一、Admin后台概述
Django Admin是内置的后台管理系统,自动为注册的Model生成增删改查界面。只需几行代码即可拥有功能完善的管理后台,支持列表展示、搜索、筛选、排序、批量操作等。
Admin是Django最强大的特性之一,大幅减少了后台管理系统的开发工作量。通过admin.py文件配置ModelAdmin类,可以自定义后台界面的展示和行为。
二、ModelAdmin常用属性
注册方式
三、基本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} 篇文章设为草稿')
六、内联类型对比
七、注意事项与最佳实践
注意:使用Admin前需执行
python manage.py migrate和createsuperuser创建数据库表和管理员账户。
注意:Admin默认只显示
__str__方法返回的内容,需要配置list_display才能显示更多字段。
注意:
fieldsets和fields/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访问。
本文涉及AI创作
内容由AI创作,请仔细甄别