Django Admin 管理工具
Django 提供了基于 web 的管理工具。
django.contrib 是一套庞大的功能集,它是 Django 基本代码的组成部分
我们可以在项目的 settings.py 中的 INSTALLED_APPS 看到这些工具
/HelloWorld/HelloWorld/settings.py
... INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ) ...
激活管理工具
通常这些管理工具会在生成项目时自动在 urls.py 中设置好,我们只需去掉注释即可激活他们
/HelloWorld/HelloWorld/urls.py
#! /usr/bin/python # -*- encoding: utf-8 -*- ''' filename: view.py author: 简单教程(www.twle.cn) copyright: Copyright © 2015-2065 www.twle.cn. All rights reserved. ''' from django.conf.urls import url from django.contrib import admin from . import view urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^hello$', view.hello), ]
配置好后,Django 管理工具就可以运行了
使用管理工具
启动开发服务器,在浏览器中访问 http://127.0.0.1:8000/admin/ 显示页面如下:
可以通过命令 python manage.py createsuperuser 来创建超级用户
[root@localhost HelloWorld]# python manage.py migrate System check identified some issues: WARNINGS: ?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default' HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. See: https://docs.djangoproject.com/en/1.11/ref/databases/#mysql-sql-mode Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying sessions.0001_initial... OK [root@localhost HelloWorld]# python manage.py createsuperuser Username (leave blank to use 'luojianguo'): demo Email address: demo@twle.cn Password: Password (again): Superuser created successfully. [root@localhost HelloWorld]#
之后输入用户名密码登录,界面如下:
注册 模型(model) 到 admin
为了让 admin 界面管理某个数据模型,我们需要先要将该模型注册到 admin 比如,我们之前在 DemoModel 中已经创建了模型 Demo
修改 TestModel/admin.py
文件
HelloWorld/TestModel/admin.py
#! /usr/bin/python # -*- encoding: utf-8 -*- ''' filename: admin.py author: 简单教程(www.twle.cn) copyright: Copyright © 2015-2065 www.twle.cn. All rights reserved. ''' from django.contrib import admin from DemoModel.models import Demo # Register your models here. admin.site.register(Demo)
刷新后即可看到 DemoModel 数据项
复杂模型
Django Admin 管理页面的功能非常强大,完全有能力处理更加复杂的数据模型。
1. 先在 DemoModel/models.py 中增加一个更复杂的数据模型
HelloWorld/DemoModel/models.py
#! /usr/bin/python # -*- encoding: utf-8 -*- ''' filename: view.py author: 简单教程(www.twle.cn) copyright: Copyright © 2015-2065 www.twle.cn. All rights reserved. ''' from django.db import models # Create your models here. class Demo(models.Model): name = models.CharField(max_length=20) class Contact(models.Model): name = models.CharField(max_length=200) age = models.IntegerField(default=0) email = models.EmailField() def __unicode__(self): return self.name class Tag(models.Model): contact = models.ForeignKey(Contact) name = models.CharField(max_length=50) def __unicode__(self): return self.name
我们新添加了两个模型: Contact 和 Tag
-
Tag 以 Contact 为外部键
-
一个 Contact 可以对应多个 Tag
我们还可以看到许多在之前没有见过的属性类型,比如 IntegerField 用于存储整数。
2. 在 DemoModel/admin.py 注册多个模型并显示
HelloWorld/TestModel/admin.py
#! /usr/bin/python # -*- encoding: utf-8 -*- ''' filename: admin.py author: 简单教程(www.twle.cn) copyright: Copyright © 2015-2065 www.twle.cn. All rights reserved. ''' from django.contrib import admin from DemoModel.models import Demo, Contact, Tag # Register your models here. admin.site.register([Demo, Contact, Tag])
刷新 admin 管理页面,显示结果如下:
在 admin 管理页面上我们可以能进行复杂模型操作
如果之前还未创建表结构,可使用以下命令创建:
[root@localhost HelloWorld]# python manage.py makemigrations DemoModel # 让 Django 知道我们在我们的模型有一些变更 [root@localhost HelloWorld]# python manage.py migrate DemoModel # 创建表结构
自定义表单
我们可以自定义 Django admin 管理页面取代默认的页面。
比如上面的 add 页面,我们想只显示 name 和 email 部分
修改 DemoModel/admin.py
HelloWorld/TestModel/admin.py
#! /usr/bin/python # -*- encoding: utf-8 -*- ''' filename: admin.py author: 简单教程(www.twle.cn) copyright: Copyright © 2015-2065 www.twle.cn. All rights reserved. ''' from django.contrib import admin from DemoModel.models import Demo, Contact, Tag class ContactAdmin(admin.ModelAdmin): fields = ('name', 'email') admin.site.register(Contact, ContactAdmin) admin.site.register([Demo, Tag])
以上代码定义了一个 ContactAdmin 类,用以说明管理页面的显示格式,里面的 fields 属性定义了要显示的字段。
由于该类对应的是 Contact 数据模型,我们在注册的时候,需要将它们一起注册。
显示效果如下:
我们还可以将输入栏分块,每个栏也可以定义自己的格式。
修改 DemoModel/admin.py
HelloWorld/TestModel/admin.py
#! /usr/bin/python # -*- encoding: utf-8 -*- ''' filename: admin.py author: 简单教程(www.twle.cn) copyright: Copyright © 2015-2065 www.twle.cn. All rights reserved. ''' from django.contrib import admin from DemoModel.models import Demo, Contact, Tag class ContactAdmin(admin.ModelAdmin): fieldsets = ( ['Main', { 'fields': ('name', 'email'), }], ['Advance', { 'classes': ('collapse',), # CSS 'fields': ('age',), }] ) admin.site.register(Contact, ContactAdmin) admin.site.register([Demo, Tag])
上面的栏目分为了 Main 和 Advance 两部分 classes 说明它所在的部分的 CSS 格式。collapse CSS样式让 Advance 部分默认隐藏:
Advance 部分旁边有一个 Show 按钮,用于展开,展开后可点击 Hide 将其隐藏,如下图所示:
内联(Inline)显示
上面的 Contact 是 Tag 的外部键,所以有外部参考的关系。
而在 默认的页面显示中,将两者分离开来,无法体现出两者的从属关系。
我们可以使用内联显示,让 Tag 附加在 Contact 的编辑页面上显示。
修改 DemoModel/admin.py
HelloWorld/TestModel/admin.py
#! /usr/bin/python # -*- encoding: utf-8 -*- ''' filename: admin.py author: 简单教程(www.twle.cn) copyright: Copyright © 2015-2065 www.twle.cn. All rights reserved. ''' from django.contrib import admin from DemoModel.models import Demo, Contact, Tag class TagInline(admin.TabularInline): model = Tag class ContactAdmin(admin.ModelAdmin): inlines = [TagInline] # Inline fieldsets = ( ['Main', { 'fields': ('name', 'email'), }], ['Advance', { 'classes': ('collapse',), 'fields': ('age',), }] ) admin.site.register(Contact, ContactAdmin) admin.site.register(Demo)
显示效果如下:
列表页的显示
在 Contact 输入数条记录后,Contact 的列表页看起来如下:
我们也可以自定义该页面的显示,比如在列表中显示更多的栏目 只需要在 ContactAdmin 中增加 list_display 属性:
HelloWorld/TestModel/admin.py
#! /usr/bin/python # -*- encoding: utf-8 -*- ''' filename: admin.py author: 简单教程(www.twle.cn) copyright: Copyright © 2015-2065 www.twle.cn. All rights reserved. ''' from django.contrib import admin from DemoModel.models import Demo, Contact, Tag class TagInline(admin.TabularInline): model = Tag class ContactAdmin(admin.ModelAdmin): list_display = ('name', 'age', 'email') # list inlines = [TagInline] # Inline fieldsets = ( ['Main', { 'fields': ('name', 'email'), }], ['Advance', { 'classes': ('collapse',), 'fields': ('age',), }] ) admin.site.register(Contact, ContactAdmin) admin.site.register(Demo)
刷新页面显示效果如下:
搜索功能在管理大量数据时非常有用 我们可以使用 search_fields 为该列表页增加搜索栏
HelloWorld/TestModel/admin.py
#! /usr/bin/python # -*- encoding: utf-8 -*- ''' filename: admin.py author: 简单教程(www.twle.cn) copyright: Copyright © 2015-2065 www.twle.cn. All rights reserved. ''' from django.contrib import admin from DemoModel.models import Demo, Contact, Tag class TagInline(admin.TabularInline): model = Tag class ContactAdmin(admin.ModelAdmin): list_display = ('name', 'age', 'email') # list search_fields = ('name',) inlines = [TagInline] # Inline fieldsets = ( ['Main', { 'fields': ('name', 'email'), }], ['Advance', { 'classes': ('collapse',), 'fields': ('age',), }] ) admin.site.register(Contact, ContactAdmin) admin.site.register(Demo)
刷新页面,然后我们搜索了 简单教程 的记录,显示结果如下:
Django Admin 管理工具还有非常多实用的功能,感兴趣的同学可以深入研究下