Django基础教程(十七)Django的模型和admin站点之对admin站点进行简单定制:别让Django后台丑哭!手把手教你给Admin站点“整容”,打工人必备摸鱼神器!

Django Admin定制全攻略

深度分析: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_displayModelAdmin 的一个属性,它是一个元组,用来指定列表页要显示哪些字段。这就好比给你的清单页加了好几列信息。

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 吧!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值