《精通Django》 第五章 Django管理后台

5.1 使用Django管理后台
  • python manage.py createsuperuser 创建超级用户
5.1.2 进入管理后台
  • 两种可编辑的内容:Groups 和 Users

  • Django 中每种数据都有一个修改列表和编辑表单。前者列出数据库中所有可用的对象,后者用于添加、修改或删除数据库中的特定记录

  • 管理后台的运作方式

    管理后台在背后是如何工作的呢?相当简单。启动服务器时,Django 运行admin.autodiscover() 函数。

    在早期的 Django 版本中,要在urls.py 文件中调用这个函数,但是现实 Django 会自动运行它。这个函

    数迭代INSTALLED_APPS 设置,在安装的各个应用中查找一个名为admin.py 的文件。如果应用中存在这个

    文件,就执行里面的代码。在books 应用的admin.py 文件中,我们调用admin.site.register(),在管理

    后台中注册各个模型。只有注册的模型才能在管理后台中显示。django.contrib.auth 应用也有admin.py

    文件,因此管理界面中才显示有"Users"和"Groups"。其他django.contrib 应用,如django.contrib.

    redirects,也把自己添加到管理后台中,从网上下载的很多第三方 Django 应用程序也会这么做。

    其实,Django 管理后台也是一个 Django 应用程序,有自己的模型、模板、视图和 URL 模式。你的应用

    之所以有管理后台,是因为你在 URL 配置中设置了------这与设置自己编写的视图一样。你可以在你下

    载的 Django 代码基中查看django/contrib/admin 里的代码,查看它的模板、视图和 URL 配置。但是,

    不要直接修改任何代码,因为里面有众多定制管理后台的钩子。阅读 Django 管理后台的代码时记住一

    点,在读取模型的元数据方面它做了相当复杂的操作,所以可能要花点时间才能理解。

5.2 把模型添加到Django管理后台中
  • mysite\books\admin.py 中代码
python 复制代码
from django.contrib import admin

# Register your models here.
from .models import Publisher, Author, Book
admin.site.register(Publisher)
admin.site.register(Book)
admin.site.register(Author)
  • 管理后台能自动处理外键和多对多关系
5.3 把字段设为可选的
  • email = models.EmailField(blank=True)
5.3.1 把日期和数值字段设为可选的
  • SQL 使用是一个特殊的值表示空值------NULL。它的意思是"未知"或"无效",或者其他情境中的特定意思。在 SQL 中,NULL 与空字符串不是一回事,就像 Python 对象None 不是空字符串("")一样。
  • 特定的字符字段(如VARCHAR 列)的值既可以是NULL,也可以是空字符串。
  • 为了避免这种歧义,Django 自动生成的CREATE TABLE 语句(参见第 4 章)中每个列定义都有NOT NULL
sql 复制代码
CREATE TABLE "books_author" (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(40) NOT NULL,
"email" varchar(75) NOT NULL
);
  • 对空字符串不是有效值的数据库列类型(如日期、时间和数字)来说,这样处理不行。如果把空字符串插入日期或整数列,数据库有可能报错------这取决于你用的数据库。

  • 此时,只能使用NULL 指定空值。在 Django 模型中,指定接受NULL 值的方式是为字段设定null=True

    参数。

    • 因此,说起来有点复杂:如果想让日期字段(如DateField、TimeField、DateTimeField)或数值字段(如IntegerField、DecimalField、FloatField)接受空值,要同时添加null=True 和blank=True。
  • 添加null=True 比添加blank=True 复杂,因为前者修改了数据库的语义,即修改了CREATE TABLE 语句,把publication_date 字段的NOT NULL 删掉了。

  • 为了完成修改,我们要更新数据库。基于一些原因,Django 不会试图自动修改数据库模式,所以每次对模型做这种修改之后要自己动手执行python manage.py migrate 命令

  • 但我做了相应的操作,还是没法赋给他空的值。。

5.4 自定义字段的标注
  • 在管理后台的编辑表单中,各个字段的标注根据模型中字段的名称生成。生成方式很简单:把下划线替换成空格,再把第一个字母变成大写。
  • 然而,根据字段名称并不是总能生成好的标注,因此有时需要自定义。自定义标注的方式是为模型字段指定verbose_name 参数
  • email = models.EmailField(blank=True, verbose_name='e-mail')
5.5 自定义ModelAdmin类
5.5.1 自定义修改列表
  • 指定Author模型的修改列表中的显示的字段,

  • 默认情况下,修改列表显示的是各个对象的__str__() 方法返回的结果。

  • 我们可以改进这种默认行为,在修改列表中添加几个其他字段

  • mysite\books\admin.py代码

python 复制代码
from django.contrib import admin

# Register your models here.
from .models import Publisher, Author, Book

class AuthorAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name', 'email')

admin.site.register(Publisher)
admin.site.register(Book)
admin.site.register(Author, AuthorAdmin)
  • 定义AuthorAdmin类

  • 修改admin.site_register()调用

    • admin.site_register() 函数的第二个参数可选,是一个ModelAdmin子类
  • 添加一个简单的搜索框

python 复制代码
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name', 'email')
    search_fields = ('first_name', 'last_name')
  • 为Book 模型的修改列表页面添加几个日期过滤器
python 复制代码
from django.contrib import admin

# Register your models here.
from .models import Publisher, Author, Book

class AuthorAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name', 'email')
    search_fields = ('first_name', 'last_name')

class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'publisher', 'publication_date')
    list_filter = ("publication_date",)
admin.site.register(Publisher)
admin.site.register(Book, BookAdmin)
admin.site.register(Author, AuthorAdmin)
  • list_filter 也能处理其他类型的字段,而非DateField 一个。(比如说,可以试试BooleanField 和ForeignKey字段。)只要有超过两个值供选择,过滤器就会显示
  • 提供日期过滤器的另一种方法是使用date_hierarchy 选项
    • 注意,date_hierarchy 的值是一个字符串,不是元组,因为只能使用一个日期字段创建层级导航
python 复制代码
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'publisher', 'publication_date')
    list_filter = ("publication_date",)
    date_hierarchy = 'publication_date'
  • 修改默认排序方式
    • 默认情况下,修改列表根据模型中class Meta(参见第 4 章)里的ordering 属性排序
python 复制代码
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'publisher', 'publication_date')
    list_filter = ("publication_date",)
    date_hierarchy = 'publication_date'
    ordering = ('-publication_date',)
5.5.2 自定义编辑表单
  • 默认情况下,编辑表单中的字段顺序与在模型中的定义顺序一致。我们可以在ModelAdmin 子类中使用fields 选项修改排序
  • fields 选项还有一个作用:排除特定的字段,禁止编辑
python 复制代码
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'publisher', 'publication_date')
    list_filter = ("publication_date",)
    date_hierarchy = 'publication_date'
    ordering = ('-publication_date',)
    fields = ('title', 'authors', 'publisher')
  • filter_horizontal
    • 此外注意,filter_horizontal 可以指定多个字段,在元组中列出各个字段的名称即可
python 复制代码
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'publisher', 'publication_date')
    list_filter = ("publication_date",)
    date_hierarchy = 'publication_date'
    ordering = ('-publication_date',)
    # fields = ('title', 'authors', 'publisher')
    filter_horizontal = ('authors',)
  • ModelAdmin 子类也支持filter_vertical 选项。它的作用与filter_horizontal 完全一样,不过得到的JavaScript 界面是纵向排列的两个选择框,而不是横向的

  • filter_horizontal 和filter_vertical 只能用于多对多字段,不能用于外键字段。

  • 默认情况下,管理后台为外键字段显示一个简单的 菜单,不过与多对多字段一样,有时你不想费力气从下拉菜单中找出所需的对象。为了解决这个问题,可以使用raw_id_fields 选项:

python 复制代码
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'publisher', 'publication_date')
    list_filter = ("publication_date",)
    date_hierarchy = 'publication_date'
    ordering = ('-publication_date',)
    # fields = ('title', 'authors', 'publisher')
    filter_horizontal = ('authors',)
    raw_id_fields = ('publisher',)
5.6 用户、分组和权限
  • 用户对象有一些标准的字段:用户名、密码、电子邮件和真实姓名

  • 此外,还有一些字段用于定义允许用户在管理界面中做什么。首先是三个布尔值旗标:

    • "Active"控制是否激活用户。如果未勾选,即便用户使用有效的密码也无法登录。
    • "Staff status"控制是否允许用户登录管理界面(即是否把用户当做组织中的一员)。因为这个用户系统也用于控制面向公众的网站(即前台,参见第 11 章),所以这个旗标对公开用户和管理员是有区别的。
    • "Superuser status"为用户赋予所有权限,可以在管理界面中添加、编辑和删除任何对象。如果勾选,用户的常规权限(即使没有)不再考虑。
  • 用户还可以分组。一个分组中的所有成员都有那一组具有的全部权限。使用分组便于为多个用户赋予相同的权限。

Python99网: https://python99 .com/python-courses

相关推荐
C***11502 小时前
Spring TransactionTemplate 深入解析与高级用法
java·数据库·spring
+VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue建筑材料管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
2301_800256112 小时前
B+树:数据库的基石 R树:空间数据的索引专家 四叉树:空间划分的网格大师
数据结构·数据库·b树·机器学习·postgresql·r-tree
大厂技术总监下海3 小时前
用户行为分析怎么做?ClickHouse + 嵌套数据结构,轻松处理复杂事件
大数据·数据结构·数据库
alonewolf_993 小时前
深入理解MySQL事务与锁机制:从原理到实践
android·数据库·mysql
朝依飞3 小时前
fastapi+SQLModel + SQLAlchemy2.x+mysql
数据库·mysql·fastapi
3***g2053 小时前
redis连接服务
数据库·redis·bootstrap
m0_598177233 小时前
SQL 方法函数(1)
数据库
oMcLin3 小时前
如何在Oracle Linux 8.4上通过配置Oracle RAC集群,确保企业级数据库的高可用性与负载均衡?
linux·数据库·oracle
信创天地3 小时前
核心系统去 “O” 攻坚:信创数据库迁移的双轨运行与数据一致性保障方案
java·大数据·数据库·金融·架构·政务