Django为我们创建并配置了默认的管理后台。我们只需要创建一个管理员(超级用户),就可以登录管理后台。
python manage.py createsuperuser
创建超级用户后,启动Django项目,后台登录地址:http://127.0.0.1:8000/admin/
注:管理后台是如何工作的呢?相当简单。启动服务器是,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模式。
1、把模型添加到Django管理后台中
from django.contrib import admin from .models import Publisher,Author,Book admin.site.register(Publisher) admin.site.register(Author) admin.site.register(Book)
2、自定义修改列表
- 在后台显示特定的字段
from django.contrib import admin from .models import Publisher,Author,Book class AuthorAdmin(admin.ModelAdmin): list_display = ('first_name','last_name','email') admin.site.register(Publisher) admin.site.register(Author,AuthorAdmin) admin.site.register(Book)
定义AuthorAdmin类。它是django.contrib.admin.Modeladmin的子类,存放指定模型在管理后台中的自定义配置。我们值做了一项定制,list_display,把它的值设为一个元组,指定要在修改列表页面显示的字段名称,当然模型中必须有这些字段。
修改admin.site.register()调用,在Author后面添加AuthorAdmin。即把‘AuthorAdmin’选项注册Author模型。admin.site.register()函数的第二个参数可选,其值是一个ModelAdmin子类。如果不指定第二个参数,Django使用默认选项注册模型。
添加一个简单的搜索框。在AuthorAdmin类中添加search_fields:
class AuthorAdmin(admin.ModelAdmin): list_display = ('first_name','last_name','email') search_fields = ('first_name','last_name')
为Book模型的修改列表页面添加几个日志过滤器:
class BookAdmin(admin.ModelAdmin): list_display = ('title', 'publisher', 'publication_date') list_filter = ('publication_date',) admin.site.register(Book, BookAdmin)
list_filter也能处理其他类型的字段,而非DateField一个。只要有超过两个值供选择,过滤器就会显示。提供日期过滤器的另一种方法是使用date_hierarchy选项:
date_hierarchy = 'publication_date'。date_hierarchy的值是一个字符串,不是元组,因为只能使用一个日期字段创建层级导航。最后,修改默认的排序方式,让修改列表页面的如数时钟以出版日志倒序排序。
class BookAdmin(admin.ModelAdmin): list_display = ('title', 'publisher', 'publication_date') list_filter = ('publication_date',) # date_hierarchy = 'publication_date' ordering = ('-publication_date',)
ModelAdmin子类中的ordering选项与模型的class Meta中的ordering属性的作用完全一样,不过只使用列表中的第一个字段名称。ordering选项的值是一个字段名称列表或元组,如果想倒序,加上减号即可。
自定义编辑表单:与修改列表一样,编辑表单的很放方面也可以定制。可以在ModelAdmin子类中使用fields选项修改排序:
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','publication_date')
添加fields之后,图书的编辑表单会使用指定的顺序显示各个字段。fie选项还有一个作用:排除特定的字段,禁止编辑。只需要去掉想要排除的字段即可。
使用filter_horizontal替换fields,可以使过滤界面更简单。强烈建议使用filter_horizontal
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','publication_date') filter_horizontal = ('authors',)
ModelAdmin子类也支持filter_vertical选项。它的作用与filter_horizontal完全一样,不过得到的JavaScript界面是纵向排列的两个选择框,而不是横向的。filter_horizontal和filter_vertical只能用于多对多字典,不能用于外键字段。
随着书籍数据库不断变大,包含几千个出版社,添加图书表单要花一些时间才能加载,因为要加载每个出版社记录,在<select>菜单中显示。为加减这个问题,可以使用raw_id_fields选项:
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','publication_date') filter_horizontal = ('authors',) raw_id_fields = ('publisher',)
raw_id_fields 这个选项的值是一个外键字段名称元组,各个字段在管理后台中显示为简单的文本输入框(<input type="text">)
3、用户、分组和权限
你是以超级用户身份登录的,有权限创建、编辑和删除任何对象。当然,不同的环境需要不同的权限系统,不是每个人都可以或应该是超级用户。Django的管理后台也有权限系统,让你给特定用户赋予访问特定功能的权限。用户帐号应该是通用的,独立于管理界面,在外部仍可以使用,但是我们现在仍把他们当作管理员账户。
-
- “Active”控制是否激活用户。如果未勾选,几遍用户使用有限的密码也无法登录;
- “Staff status”控制是否允许用户登录管理界面(即是否把用户当作组织中的一员)。因为这个用户系统也用于控制面向公众的网站(即前台),所以这个旗标对公开公虎和管理员是有区别的;
- “Superuser status”为用户赋予所有权限,可以在管理界面中添加、编辑和删除任何对象。如果勾选,用户的常规权限(即使没有)不再考虑。