第二十课 Admin后台管理
1. admin创建用户
创建管理员账号:
python manage.py createsuperuser
# 按提示输入用户名、邮箱、密码
2. 注册模型
如果只是在admin中简单的展示及管理模型,需要在admin.py
模块中使用admin.site.register将模型注册:
from django.contrib import admin
from myproject.myapp.models import Author
admin.site.register(Author)
但是,有时候我们需要对admin进行各种深度定制,以满足我们的需求。这就要使用Django为我们提供的ModelAdmin类了,例子:
from django.contrib import admin
from myproject.myapp.models import Author
# 创建一个ModelAdmin的子类
class AuthorAdmin(admin.ModelAdmin):
pass
# 注册的时候,将原模型和ModelAdmin耦合起来
admin.site.register(Author, AuthorAdmin)
3. 用装饰器注册注册模型
除了常用的admin.site.register(Author,AuthorAdmin)
方式进行注册,还可以用装饰器的方式连接模型和ModelAdmin。例如:
from django.contrib import admin
from .models import Author
@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
pass
这个装饰器可以接收一些模型类作为参数,以及一个可选的关键字参数site,例如:
from django.contrib import admin
from .models import Author, Reader, Editor
from myproject.admin_site import custom_admin_site
@admin.register(Author, Reader, Editor, site=custom_admin_site)
class PersonAdmin(admin.ModelAdmin):
pass
4. ModelAdmin的属性
ModelAdmin非常灵活,它有许多内置属性,帮助我们自定义admin的界面和功能
(1)ModelAdmin.actions
一个列表,包含自定义的actions
(2)ModelAdmin.actions_on_top
是否在列表上方显示actions的下拉框,默认为True
(3)ModelAdmin.actions_on_bottom
是否在列表下方显示actions的下拉框,默认为False。效果见下面的图片
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4e8xBdnl-1608304247316)(/home/pyvip/py_case/python 笔记/图片/1762677-20201006091152267-1732573258.png)]
(4)ModelAdmin.actions_selection_counter
是否在actions下拉框右侧显示选中的对象的数量,默认为True,可改为False
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QcM1eQ98-1608304247318)(/home/pyvip/py_case/python 笔记/图片/1762677-20201006091201243-284760212.png)]
(5)ModelAdmin.date_hierarchy
根据你指定的日期相关的字段,为页面创建一个时间导航栏,可通过日期过滤对象。例如:
date_hierarchy = 'pub_date'
它的效果如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JdmjRu7N-1608304247319)(/home/pyvip/py_case/python 笔记/图片/1762677-20201006091206305-1467394714.png)]
也可以指定为关联的日期字段:
date_hierarchy = 'author__pub_date'
(6)ModelAdmin.empty_value_display
指定空白显示的内容。如果有些字段没有值,默认情况下会显示破折号“-”。这个选项可以让你自定义显示什么,例如:
from django.contrib import admin
class AuthorAdmin(admin.ModelAdmin):
empty_value_display = '-empty-'
还可以为整个admin站点设置默认空白显示值,通过设置AdminSite.empty_value_display="xxxxxxx"
。甚至为某个函数设置空白值,如下:
from django.contrib import admin
class AuthorAdmin(admin.ModelAdmin):
fields = ('name', 'title', 'view_birth_date')
def view_birth_date(self, obj):
return obj.birth_date
# 注意下面这句
view_birth_date.empty_value_display = '???'
(7)ModelAdmin.exclude
不显示指定的某些字段
如下例有这么个模型:
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
title = models.CharField(max_length=3)
birth_date = models.DateField(blank=True, null=True)
如果你不希望在页面内显示birth_date
字段,那么这么设置:
from django.contrib import admin
class AuthorAdmin(admin.ModelAdmin):
fields = ('name', 'title')
和这么设置是一样的:
from django.contrib import admin
class AuthorAdmin(admin.ModelAdmin):
exclude = ('birth_date',)
(8)ModelAdmin.fields
按顺序显示指定的字段
可以通过组合元组的方式,让某些字段在同一行内显示。例如下面的做法“url”和“title”将在一行内,而“content”则在下一行:
class FlatPageAdmin(admin.ModelAdmin):
fields = (('url', 'title'), 'content')
如果没有对field或fieldsets选项进行定义,那么Django将按照模型定义中的顺序,每一行显示一个字段的方式,逐个显示所有的非AutoField和editable=True的字段
(9)ModelAdmin.fieldsets
根据字段对页面进行分组显示或布局,fieldsets是一个二元元组的列表。每个二元元组代表一个<fieldset>
二元元组的格式为(name,field_options)
,name是一个表示该filedset标题的字符串,field_options
是一个包含在该filedset内的字段列表。例如:
from django.contrib import admin
class FlatPageAdmin(admin.ModelAdmin):
fieldsets = (
(None, {
'fields': ('url', 'title', 'content', 'sites')
}),
('Advanced options', {
'classes': ('collapse',),
'fields': ('registration_required', 'template_name'),
}),
)
它的页面看起来像下面的样子:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j8BhVJPf-1608304247321)(/home/pyvip/py_case/python 笔记/图片/1762677-20201006091218653-1760961744.png)]
在filed_options
字典内,可以使用下面这些关键字:
fields:一个必填的元组,包含要在fieldset中显示的字段。例如:
{
'fields': ('first_name', 'last_name', 'address', 'city', 'state'),
}
同样,它也可以像前面那样通过组合元组,实现多个字段在一行内的效果:
{
'fields': (('first_name', 'last_name'), 'address', 'city', 'state'),
}
fileds可以包含readonly_fields
的值,作为只读字段。
classes:一个包含额外的CSS类的元组,例如:
{
'classes': ('wide', 'extrapretty'),
}
两个比较有用的样式是collaspe
和