服务端编程(八)- Django - admin 后台管理站点 后台操作数据库

前言 ´・ᴗ・`

  • 本节主要讲了 如何配置admin 使得我们可以利用django的可视化页面admin 后台操作数据库
  • 本篇内容将会帮助你学习…
    • 1 创建后台 超级管理员root
    • 2 admin注册ORM模型
    • 3 admin 管理页面的魔改
    • 4 app 操作数据库(ORM模型)的基本思路

创建ROOT账户

后台管理 首先得创立账户
我们在 有manage.py的目录下 运行

python manage.py createsuperuser

其实就是利用manage.py的工具 输入“create super user”命令而已

然后会填写一系列信息 随便填写 问题不大

admin注册ORM模型

还记得之前在setting里面注册过一些组件嘛:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth', # authentic 验证
    'django.contrib.contenttypes',
    'django.contrib.sessions', # session 会话
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'catalog'
]

现在我们就开始应用admin这个app(application)

既然是管理ORM模型· 进行增删改查CRUD 就需要先登记一下 注册一下 于是
在/locallibrary/catalog/admin.py 也就是admin应用的设置文件里 加上:

from django.contrib import admin
from.models import Author,Genre,Book,BookInstance

admin.site.register(Book)
admin.site.register(Author)
admin.site.register(Genre)
admin.site.register(BookInstance)

这样我们就可以对四个模型book author genre bookinstance进行修改了

当然这里剧透一下 后面admin要支持更多样的管理方式 还需要添加一些参数

打开服务器运行吧

注册完ORM 现在就可以运行了 Django把admin控制界面设计的工作包了

python manage.py runserver

然后 浏览器地址: http://127.0.0.1:8000/admin
其实就是根目录下的/admin

我们就迎来了第一个可以看的下去的页面:
在这里插入图片描述然后 我们要来添加书籍了
界面很友好 怎么操作我就不费篇幅来讲了
添加数据的要求是 至少3类书 每类书两个以上的实例(book instance)
具体的书就是实例
书的种类就是 book
最好有几个作者
这样 后期玩的时候会更加开心

像我个人添加了自己看的20多本书 后面页面就会比较好玩(有数据 页面比较充实)

修改一下语言

有些同志会觉得原版的 默认是英语 后台管理很蓝瘦 我们可以设计成中文 就像我的页面一样:
在这里插入图片描述
setting.py 找到图中这几项 按我的更改就行

LANGUAGE_CODE = 'zh-hans'

# 把国际时区改为中国时区(东八区)
TIME_ZONE = 'Asia/Shanghai'

这个问题之前讲过 可能有同志忘了2333 这里再提醒一下

进一步修改…

虽然说页面比较友好了 其实我们还可以试着自定义一下
目前我们对于四个模型 分别拿到的是4张表
对于genre表 没啥好改的 因为只有一列 如图
在这里插入图片描述
但是 对于 book book instance这些 记录(record)很多,该如何筛选排序 如何添加 我们应该想显示 我们想要的信息(列) 如下:
在这里插入图片描述

这就需要用到model.admin 类,当然我们是继承 并修改参数 达到目的

# admin.site.register(Author) 这句不用了
@admin.register(Author) #这句就能实现注册 Python的装饰器了解一下
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('last_name', 'first_name', 'date_of_birth', 'date_of_death')

list_display就是我们想要显示的几列

同样 我们改造一下book:

在这里插入图片描述
你可能照葫芦画瓢的这么写:

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'genre')

但其实应该这么写:
首先 model.py book类 添加一个函数display_genre

    def display_genre(self):
        return ', '.join([ genre.name for genre in self.genre.all()[:3] ])

然后 我们在admin.py 这么写:

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'display_genre')

也就 比起直接调用genre属性 我们用display_genre函数做了个转手 主要是避免资源消耗 具体原因见下面

这里注意 genre这个属性 这个model.py book类的属性 代表的也是数据库中 多对多的外键

  • ManyToOneField 就是传统sql里面的外键foreign key的应用 类似于数学的映射 多对一 一个第一作者 有多个作品 然而 一本书只有一个 第一作者
    于是外键就是 在作品这方(“多”)可以引用 作者方(“一”)
    因为作者就相当于标签 比如 我们对一群学生作区分 研究生 本科生 专科生 是三个标签 但是学生有千千万万 于是我们学生的表格就应该引用 只有三个标签(应该是标签表中的记录)
    同样 我们给书打标签 也是如此
  • OneToManyField 就是前者 多对一 反过来就行
  • ManyToManyField 多对多 这是外键的拓展 一本书可以已有多个领域分类(genre) 而一个领域分类肯定包含多本书

对数据库而言 本身底层是没有“多对多”的 外键主要是多对一 因此 ORM这里虽然有个模型“ManyToManyField” 但是因为并非原生而是原生基础上有封装 真正操作起来系统资源消耗大

对于book instance 我们就正常套路写:

@admin.register(BookInstance)
class BookInstanceAdmin(admin.ModelAdmin):
    list_display = ('book', 'status','borrower', 'due_back','id')

在这里插入图片描述
这里 你可能左边的部分有了 右边没有
过滤器filter就是通过一些属性过滤你不想要的记录(具体就是那些书你不想要)‘’
比如查询没有被借走的书 可以用过status过滤 具体自己玩玩就知道

过滤器设置方式:

@admin.register(BookInstance)
class BookInstanceAdmin(admin.ModelAdmin):
    list_display = ('book', 'status','borrower', 'due_back','id')
    list_filter = ('status', 'due_back')

就是加了行 list_filter 而已

值得注意的是 列的顺序 可以通过 元祖里面 属性的顺序 进行改变:
比如我把status与book调换

@admin.register(BookInstance)
class BookInstanceAdmin(admin.ModelAdmin):
    list_display = ('status', 'book','borrower', 'due_back','id')
    list_filter = ('status', 'due_back')

结果:
在这里插入图片描述

对更新数据的页面 我们可以这么魔改

我们如果添加修改新的数据 比如 新的一本书:
在这里插入图片描述
然而我想做成下面这个样式:
在这里插入图片描述
实现方式很简单 你看了代码就懂了:

@admin.register(BookInstance)
class BookInstanceAdmin(admin.ModelAdmin):
    list_display = ('status','book','borrower', 'due_back','id')
    list_filter = ('status', 'due_back')
    fieldsets = (
        ('base info', {
            'fields': ('book','imprint', 'id')
        }),
        ('Availability', {
            'fields': ('status', 'due_back','borrower')
        }),
    )

注意base info Availability 放在哪里 你就可以自定义了 比方改成中文:)

另外 想要实现下面的效果:
在这里插入图片描述
看代码就懂了:

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('last_name', 'first_name', 'date_of_birth', 'date_of_death')
    fields = ['first_name', 'last_name', ('date_of_birth', 'date_of_death')]

inline 内联式的录入数据

有时候 我们输入书本种类信息的同时 也已经知道作者的信息 还有具体哪些书的信息
然而因为书本book 与作者author 还有书的实例book instance 在不同的表上
这时mmmp 你得跑多两趟
假设有好几百个记录 你真的是得哭

这里我们可以这么设计一波:
在添加作者author的时候 我们可以同时搞定他的书:
在这里插入图片描述
添加书的种类book的时候 我们可以添加书的实例:
在这里插入图片描述
怎么设置的?下面是author设计的代码:

class Authorinline(admin.TabularInline):
    model = Book

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('last_name', 'first_name', 'date_of_birth', 'date_of_death')
    fields = ['first_name', 'last_name', ('date_of_birth', 'date_of_death')]
    inlines = [Authorinline]

inline属性重点关注 就是他搞得
而它引用了Authorinline类 其实就是引用Book类:)
(貌似很简单的样子)

同样 book的admin也是这样:

class BooksInstanceInline(admin.StackedInline):
    model = BookInstance

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'display_genre')
    inlines = [BooksInstanceInline]

那么 我想修改作者的时候 加上书 书的实例 该怎么办:
我们可能会这么写:

class Author_book(admin.TabularInline):
    model = Book
class Author_bookInstance(admin.TabularInline):
    model = BookInstance

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('last_name', 'first_name', 'date_of_birth', 'date_of_death')
    fields = ['first_name', 'last_name', ('date_of_birth', 'date_of_death')]
    inlines = [Author_book,Author_bookInstance]

然后报错

原因?
注意 inline 内联别人 你需要外键
author与书的实例之间没有联系 所以数据库录入没法做

因此 你可以添加外键以后 实现这一壮举:)

__str__

聪明的你应该发现了 我们list_display 还有filter放的都是 model.py 类的属性名 无论是值属性genre还是函数display_genre(也算是类的属性)
其实我们就是用admin这个应用 引用类 引用类的属性 这点适用于几乎所有其他的app 这点请注意:)

那么 直接引用属性 为啥就能真么机智的把名字返回给你呢?这中间是不是有个函数在背后默默奉献?
这就是model 类下面的__str__ 函数干的事
于是 我们要是想来点自定义customization 就可以修改__str__
在这里插入图片描述
这里 我把model.py author类的__str__ 改成:

    def __str__(self):
        return f'{self.last_name}+{self.first_name}'

这个更改以后 所有引用到author的 都会这么显示:
在这里插入图片描述
另外一种更改方式也很简单 比方我需要在book的管理页面显示author 不用+号
但是其他的引用 用+号
这时 就把list_display 里面的属性 改成函数 就像我们整genre的方法一样

具体同志们可以试试 很简单的

总结 ´◡`

这一节我们学习了Django内置的admin的用法
另外举一反三的了解了 app 管理数据库(应该说ORM数据模型) 就是通过 注册 引用类 引用属性
这三板斧来实施的

下一站:服务端编程(九)- Django - 创建网站的基本骨架 创建你的主页

  • 想学习数据库 打好后端基础嘛? 不妨从MySQL入手
    MySQL专栏

  • python这么火 想要深入学习python 玩一下简单的应用嘛?可以看我专栏 还在持续更新中哦:
    python应用

  • 小孩子才做选择 大人全都要!对后端感兴趣吗?收下它吧:)
    手把手带你学后端(服务端)

  • 谢谢支持! 阮菜鸡有礼了:)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章