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