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

相关推荐
小陈工2 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
科技小花7 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸7 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain7 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希8 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神8 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员8 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java8 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿8 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴8 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存