深度分析:Django基础教程之给Admin站点“整容”
第一章:初遇Admin——从惊喜到嫌弃的心路历程
当你第一次在Django项目里运行python manage.py createsuperuser,然后颤颤巍巍地打开 /admin 网址时,那种感觉,是不是像极了拆盲盒?
“哇!我的模型(Model)居然自己就有一个管理页面了?!Django,YYDS!”
但兴奋劲儿通常持续不过三秒。当你兴冲冲地想给你的“博客文章(Article)”模型添加几条数据时,你会发现后台列表页只孤零零地显示着一个 Article object (1)。这是啥?谁的文章?完全不知道!
此时的你,内心OS大概是:“这玩意儿,中看不中用啊……”
别急,Django早就看穿了一切。它给你的Admin站点留了充足的“后门”,哦不,是API接口,让你可以随心所欲地给它“化妆”、“换装”,甚至“整容”。它就像一个素颜的程序员,底子(功能)极好,就等你来捯饬了。
第二章:化妆师就位——认识ModelAdmin这个万能化妆盒
想要定制哪个模型在后台的展示,你只需要一个神奇的“化妆盒”——ModelAdmin类。
这个盒子里装满了各种“化妆品”(属性和方法),专治后台的各种“不服”。使用方法也极其简单,在你应用的 admin.py 文件里,给你心爱的模型注册一下就行。
基础注册代码(素颜状态):
# myapp/admin.py
from django.contrib import admin
from .models import Article # 假设我们有一个“文章”模型
# 最简单的方式:直接注册
admin.site.register(Article)
但这只是原生态。我们要玩点花的,就得请出我们的化妆盒:
# myapp/admin.py
from django.contrib import admin
from .models import Article
# 创建化妆盒(ModelAdmin子类)
class ArticleAdmin(admin.ModelAdmin):
# 在这里添置各种“化妆品”
pass
# 注册模型,并指定使用我们这个定制版的化妆盒
admin.site.register(Article, ArticleAdmin)
好了,舞台已经搭好,接下来就是见证奇迹的时刻。
第三章:清单页“换头术”——告别object (1)
首先,我们要解决列表页那个恼人的 Article object (1)。这需要我们回到“模特”(模型)本身,给它一个清晰的“自我介绍”。
步骤一:给模型定义__str__方法
这个方法决定了Django在需要把模型对象当作字符串显示时(比如在Admin列表里),该显示什么。
# myapp/models.py
from django.db import models
class Article(models.Model):
title = models.CharField('标题', max_length=200)
author = models.CharField('作者', max_length=100)
publish_date = models.DateField('发布日期')
is_published = models.BooleanField('是否发布', default=False)
def __str__(self):
# 现在,列表页会清晰显示文章标题
return self.title
搞定!刷新后台,你会看到列表页已经能显示文章的标题了。但这还不够,我们还想看到更多信息,比如作者、发布日期等。
步骤二:使用list_display,打造信息丰富的清单页
list_display 是 ModelAdmin 的一个属性,它是一个元组,用来指定列表页要显示哪些字段。这就好比给你的清单页加了好几列信息。
class ArticleAdmin(admin.ModelAdmin):
# 指定列表页要显示的字段
list_display = ('title', 'author', 'publish_date', 'is_published')
刷新一下,哇!一个信息丰富的表格出现了,一目了然。
第四章:装上“雷达”和“筛子”——效率翻倍的神器
数据多了以后,光靠眼睛找可不行。我们得装上搜索和过滤功能。
神器一:list_filter(横向筛子)
在列表页的右侧添加一个侧边栏,让你可以快速按某些字段进行过滤。
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'publish_date', 'is_published')
# 添加过滤器,通常用于有明确分类或状态的字段
list_filter = ('is_published', 'publish_date', 'author')
现在,你可以轻松筛选出“已发布”或“未发布”的文章,或者按日期、作者进行筛选。
神器二:search_fields(顶部雷达)
在列表页顶部添加一个搜索框,让你可以全局搜索特定内容。
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'publish_date', 'is_published')
list_filter = ('is_published', 'publish_date', 'author')
# 添加搜索字段,指定搜索哪些字段
search_fields = ('title', 'author')
现在,输入任意关键词,只要标题或作者中包含它,就能立刻被“雷达”捕捉到。
神器三:list_per_page(分页器)
数据太多一页显示不下?分个页吧。
class ArticleAdmin(admin.ModelAdmin):
# ... 其他配置同上 ...
list_per_page = 20 # 每页显示20条记录
第五章:编辑页“精装修”——从毛坯到精装
列表页搞定了,我们再来“装修”一下点进去后的编辑页面。
精装一:fieldsets,给字段分个组
默认的编辑页所有字段堆在一起,很乱。用fieldsets可以把它们分成不同的小组,逻辑清晰。
class ArticleAdmin(admin.ModelAdmin):
# ... 列表页配置 ...
# 编辑页字段分组
fieldsets = (
('基础信息', { # 第一个分组
'fields': ('title', 'author')
}),
('时间与状态', { # 第二个分组
'fields': ('publish_date', 'is_published'),
'classes': ('collapse',) # 这个分组默认可以折叠起来,高级感!
}),
)
这样,“基础信息”和“时间与状态”就分成了两个清晰的小板块,并且时间状态板块还可以折叠,界面瞬间清爽。
精装二:prepopulated_fields,懒人必备的“自动填充”
如果你的文章有slug字段(用于生成友好的URL),你可以让它根据标题自动填充。
# 首先,给模型加个slug字段
# models.py
class Article(models.Model):
# ... 其他字段 ...
slug = models.SlugField('URL标识', max_length=200, unique=True)
# 然后,在admin.py中配置
class ArticleAdmin(admin.ModelAdmin):
# ... 其他配置 ...
prepopulated_fields = {"slug": ("title",)} # 用title的内容自动填充slug
现在,当你在标题栏输入“我的第一篇文章”时,slug字段会自动变成 “wo-de-di-yi-pian-wen-zhang”,简直是懒人福音!
第六章:完整示例大赏——从零到一的华丽变身
说了这么多,我们来一个完整的、可运行的示例,让你感受一下“整容”前后的天壤之别。
1. 模型(models.py)
from django.db import models
class Article(models.Model):
title = models.CharField('标题', max_length=200)
slug = models.SlugField('URL标识', max_length=200, unique=True)
author = models.CharField('作者', max_length=100)
content = models.TextField('内容')
publish_date = models.DateField('发布日期')
is_published = models.BooleanField('是否发布', default=False)
update_time = models.DateTimeField('更新时间', auto_now=True)
def __str__(self):
return self.title
class Meta:
verbose_name = '文章'
verbose_name_plural = '文章管理' # 在Admin中显示更友好的复数名
2. 终极定制Admin(admin.py)
from django.contrib import admin
from .models import Article
@admin.register(Article) # 这是另一种注册方式,用装饰器,更优雅!
class ArticleAdmin(admin.ModelAdmin):
# 列表页定制
list_display = ('title', 'author', 'publish_date', 'is_published', 'update_time')
list_filter = ('is_published', 'publish_date', 'author')
search_fields = ('title', 'author', 'content')
list_per_page = 25
list_editable = ('is_published',) # 【彩蛋】直接在列表页勾选是否发布,无需点进编辑页!
date_hierarchy = 'publish_date' # 【彩蛋】在列表页顶部添加一个日期导航层级
# 编辑页定制
fieldsets = (
(None, {
'fields': ('title', 'slug', 'author', 'content')
}),
('高级选项', {
'fields': ('publish_date', 'is_published'),
'classes': ('collapse',),
'description': '这些选项可以折叠起来,保持页面整洁。'
}),
)
prepopulated_fields = {'slug': ('title',)}
“整容”后效果:
- 列表页: 信息丰富,可搜索、可过滤、可分页,还能直接修改发布状态,顶部有日期导航。
- 编辑页: 字段分组明确,逻辑清晰,有可折叠的高级选项,slug自动生成。
从那个连亲妈都不认识的 Article object (1),到现在这个功能强大、界面友好的专业数据管理后台,你的Django Admin已经完成了华丽的蜕变!
结语:你的后台,你做主
看到这里,你是不是已经摩拳擦掌,想赶紧去折腾自己的Admin站点了?Django Admin的定制能力远不止于此,今天介绍的只是最常用、最能立刻见效的“基础化妆术”。
记住,一个精心定制过的Admin后台,绝不仅仅是“好看”。它更是你数据处理效率的倍增器,是你在老板和同事面前展示专业度的“摸鱼…啊呸,是专业操守的体现”!所以,别再让它的潜力沉睡,快去动手,打造一个属于你自己的、独一无二的数据管理 cockpit 吧!
Django Admin定制全攻略
798

被折叠的 条评论
为什么被折叠?



