Admin基础
admin后台本质上是Django给我们提供的一个app。
环境配置
admin依赖以下四个模块,请确保它们存在于INSTALLED_APPS中:
django.contrib.auth
django.contrib.contenttypes
django.contrib.messages
django.contrib.sessions
并且要将django.contrib.admin加入到INSTALLED_APPS列表。
创建超级用户
python manage.py createsuperuser
要修改管理员的路由,安全起见,不能用默认的admin/路径。
修改超级用户密码
python manage.py shell
from django.contrib.auth.models import User
user = User.objects.get(username=’<用户名>’)
user.set_password(‘<新密码>’)
user.save()
或
python manage.py changepassword <用户名>
#修改指定的用户的密码(提供用户名)或修改当前系统用户密码(不提供用户名)
访问Admin界面
http://localhost:8000/admin/
注册数据表
在admin.py中:
admin.site.register(<表>) #一次只能注册一个类
ModelAdmin类
对于每个模型,可创建一个对应的ModelAdmin类,这个类的属性就是模型的所有自定义设置。
class <类名>Admin(admin.ModelAdmin):
#设置ModelAdmin属性...
admin.site.register(<表>, <表>Admin) #将数据表和它的ModelAdmin类绑定注册
@admin.register(<表>): #第二种方法,装饰器注册
class <表>Admin(admin.ModelAdmin):
#设置ModelAdmin属性...
ModelAdmin的属性
list_display
在实例的修改界面横排显示指定的字段。
list_display = (‘<字段1>’, ‘<字段2>’, ...)
list_filter
在实例的列表界面显示一个FILTER右边栏,用指定的字段进行分类。
可分类的字段:BooleanField、CharField、DateField、DateTimeField、IntegerField、ForeignKey、ManyToManyField
list_filter = [‘<字段1>’, ‘<字段2>’, ...]
search_fields
在实例的列表界面添加搜索框,在指定字段的范围内搜索。
search_fields = [‘<字段1>’, ‘<字段2>’, ...] #字段为CharField和TextField
actions
一个包含自定义行为的列表。
actions_on_top
默认为True,在页面的列表上方显示actions下拉框。
actions_on_bottom
默认为False,当为True时,在页面的列表下方显示actions下拉框。
actions_selection_counter
默认为True,在action下拉框右侧显示选中的对象数量。
date_hierarchy
指定一个日期型字段,为页面创建一个通过日期过滤对象的时间导航栏。
date_hierarchy = ‘date’
empty_value_display
设置类中的空值字段的默认显示内容(如None,空字符串等),默认是’-’。
empty_value_display = ‘-empty-’
可以设置全局的字段空值的默认显示内容:
admin.site.empty_value_display = ‘-empty-’ #这是一行新代码,并不在类中缩进!
exclude
对指定的字段排除显示。
exclude = ('<字段1>', ‘<字段2>’, ...)
fields
指定显示的字段,其顺序也是字段在Admin后台显示的顺序。
fields = ('<字段1>', ‘<字段2>’, ...)
可以组合元组,让几个字段在同一行显示,如:
fields = ( ('<字段1>', ‘<字段2>’), ‘<字段3>’, ...)
fieldsets
根据字段对页面进行分组显示,传入二元元组,其中每个元组代表一个分组。
fieldsets = (
(‘<分组标题A>’, { # <分组标题>可用None表示无标题
‘fields’: (‘<字段1>’, ‘<字段2>’, ...)
} ),
(‘<分组标题B>’, {
‘fields’: (‘<字段3>’,)
} ),
...
)
显示样式:
分组标题A
字段1
字段2
...
分组标题B
字段3
...
fields同样可以组合元组,让几个字段在同一行显示:
fields = ( ('<字段1>', ‘<字段2>’), ‘<字段3>’, ...)
跟’fields’同级别的属性:
‘classes’: (‘wide’, ‘collaspe’)
一个包含额外CSS类的元组,wide让分组具备更宽的水平空间,collaspe将整个分组折叠。
‘description’
一个可选的额外说明文本,放在每个分组的顶部,如果内部有HTML语法将不被转义。
filter_horizontal
将指定的多对多字段分成水平两部分显示(默认是一个选择框)。
filter_vertical
将指定的多对多字段分成垂直两部分显示(默认是一个选择框)。
form
编写自定义的ModelForm,用于添加/修改页面的表单。
list_editable
指定在修改页面中可以直接编辑的字段,指定的字段将显示为编辑框。
只能设置list_display中的字段。
list_max_show_all
指定一个数值,当列表元素总数大于该值时,显示为“show all”链接,默认为200。
list_per_page
设置每页显示的元素个数,默认为100。
list_select_related
使用select_related()方法查询数据,可以减少数据库访问,默认为False(只对ForeighKey字段调用),当为True时始终调用。
可以传入元组或列表,指定用select_related()查询的字段。
list_select_related = (‘<字段1>’, ‘<字段2>’, ...)
ordering
设置排序方式,传入元组或列表。
radio_fields
用选项展示ForeighKey字段。
save_as
默认为False,显示为“保存并添加另一个”按钮,当为True时变成“保存为新对象”按钮。
save_as_continue
默认为True,在保存新对象后跳转到修改页面,当为False时,跳转到元素列表页面。
save_on_top
默认为False,当为True时,页面顶部会提供同样的一系列保存按钮。
show_full_result_count
默认为True,显示过滤后的对象的总数,如“99 results (143 total)”,对整个表进行count()操作,如果数据表很大,会耗费一定的资源;当为False时显示为“99 results (show all)“。
#将子表的数据放在主表数据中编辑,此时主表字段下面提供n组相关联的子表字段
class <子表名>InLine(admin.StackedInLine): #可继承admin.TabularInLine进行扁平化显示
model = <子表名>
extra = <编辑的子表数>
class <主表名>Admin(admin.ModelAdmin):
inlines = [<子表名>InLine]
自定义Admin首页
修改Admin页面顶端的显示文字:
在admin.py中:
django.contrib.admin.AdminSite.site_header = ‘xxx’
修改Admin首页模板:
写入”项目根目录/templates/admin/base_site.html“的模板,见templates笔记第1页。
自定义Admin的Action操作
Action操作用于修改大量的目标,可以编写action函数来自定义该操作。
①在ModelAdmin类中添加属性:
actions = [‘<函数名>’] #将action函数预先添加到ModelAdmin中
②编写action函数
action函数必须携带三个参数:当前的ModelAdmin、request、被选择的QuerySet对象。
在ModelAdmin类中继续①的代码:
def <函数名>(self, request, queryset): #用self访问ModelAdmin类本身
for obj in queryset:
#对Queryset进行修改...
self.message_user(request, ‘xxxx’) #为操作添加提示信息,xxxx显示为页面顶部绿色行
<函数名>.short_description = ‘xxx’ #对函数添加描述,显示为Action下拉列表中的名称,
下拉列表中默认显示为函数名
action函数的全站引用与禁用
admin.site.add_action(<函数名>) #将action函数作用于整个admin站点
admin.site.disable_action(<函数名>) #将action函数全站禁用
#全站禁用的action函数也可以添加到某个ModelAdmin类的action属性中,进行显式的引用
class <类名>Admin(admin.ModelAdmin):
actions = None #禁用该模型中的所有action函数