文章目录
前言 ´・ᴗ・`
- 本节主要讲了 如何配置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应用 -
小孩子才做选择 大人全都要!对后端感兴趣吗?收下它吧:)
手把手带你学后端(服务端) -
谢谢支持! 阮菜鸡有礼了:)