《精通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

相关推荐
Anarkh_Lee2 分钟前
【小白也能实现智能问数智能体】使用开源的universal-db-mcp在coze中实现问数 AskDB智能体
数据库·人工智能·ai·开源·ai编程
橘子1325 分钟前
MySQL用户管理(十三)
数据库·mysql
Dxy123931021625 分钟前
MySQL如何加唯一索引
android·数据库·mysql
我真的是大笨蛋30 分钟前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
怣5030 分钟前
MySQL数据检索入门:从零开始学SELECT查询
数据库·mysql
shengli72232 分钟前
机器学习与人工智能
jvm·数据库·python
2301_7657031441 分钟前
Python迭代器(Iterator)揭秘:for循环背后的故事
jvm·数据库·python
倔强的石头1061 小时前
关键信息基础设施的数据库选型:高可用、全链路安全与平滑替代的技术实践
数据库·安全·金仓数据库
人道领域1 小时前
javaWeb从入门到进阶(SpringBoot事务管理及AOP)
java·数据库·mysql
煎蛋学姐1 小时前
SSM音乐播放软件的开发与实现7g5j0(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·javaweb 开发·前后端开发