(3)复杂模型
- 管理页面可以处理更加复杂的数据模型,如外外键约束等,实例:
- 修改models.py文件,创建三个表,一个表使用外键约束 # -*- coding: utf-8 -*- from django.db import models class Aaa(models.Model): name = models.CharField(max_length=20) age = models.CharField(max_length=3) class Bbb(models.Model): name = models.CharField(max_length=20) age = models.IntegerField(default=0) def __unicode__(self): return self.name class Tag(models.Model): contact = models.ForeignKey(Bbb,on_delete=models.CASCADE) name = models.CharField(max_length=20) def __unicode__(self): return self.name
其中models.ForeignKey(Bbb,on_delete=models.CASCADE),表示外键关联,其中models.CASCADE表示在关联数据表字段做出操作时,自身表做的操作
- CASCADE:默认选项,表示级联删除
- PROTECT:保护模式,使用该选项,在删除时,会抛出ProtectedError的错误
- SET_NULL:置空模式,删除时,外键字段被设置为空,前提是blank=True、null=True,定义该字段时,需要外键允许为空
- SET_DEFAULT:删除时,外键字段设置为默认值,使用该选项时,需要注意外键的上一个默认值
- SET( ):括号里可以是函数,设置自定义的值
- DO_NOTHING:什么也不做
对操作进行记录,对模型进行修改
(test) PS F:\django\helloworld> python manage.py makemigrations TestModel Migrations for 'TestModel': TestModel\migrations\0002_bbb_tag.py - Create model Bbb - Create model Tag (test) PS F:\django\helloworld> python manage.py migrate TestModel Operations to perform: Apply all migrations: TestModel Running migrations: Applying TestModel.0002_bbb_tag... OK
- 查看数据库,发现成功创建
mysql> show tables; +----------------------------+ | Tables_in_test | +----------------------------+ | TestModel_aaa | | TestModel_bbb | | TestModel_tag | | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | django_admin_log | | django_content_type | | django_migrations | | django_session | +----------------------------+ 13 rows in set (0.00 sec) mysql> show create table TestModel_bbb; +---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | TestModel_bbb | CREATE TABLE `TestModel_bbb` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> show create table TestModel_tag; +---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | TestModel_tag | CREATE TABLE `TestModel_tag` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `contact_id` bigint(20) NOT NULL, PRIMARY KEY (`id`), KEY `TestModel_tag_contact_id_05dff71d_fk_TestModel_bbb_id` (`contact_id`), CONSTRAINT `TestModel_tag_contact_id_05dff71d_fk_TestModel_bbb_id` FOREIGN KEY (`contact_id`) REFERENCES `TestModel_bbb` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
- 修改
TestModel/admin.py
文件,注册数据模型
from django.contrib import admin from TestModel.models import Aaa,Bbb,Tag #导入所有数据模型 # Register your models here. admin.site.register([Aaa,Bbb,Tag])
启动django,查看Admin管理平台,发现注册成功
(4)自定义表单
- 可以自定义管理页面,来取代默认的页面,例如:
- 修改TestModel/admin.py文件 from django.contrib import admin from TestModel.models import Aaa,Bbb,Tag # Register your models here. class BbbAdmin(admin.ModelAdmin): fields = ('name',) #只显示name,注意这里是元组,单个参数后需要加逗号 admin.site.register(Bbb,BbbAdmin) admin.site.register([Aaa,Tag])
以上代码定义了BbbAdmin类,里面的fields属性定义了要显示的字段,通过admin.site.register(Bbb,BbbAdmin),第一个参数是模型中的数据表名称,第二个参数是指定此模型使用的显示格式
现在来看Admin管理平台,依次点击Bbbs—>增加BBB,可以看到只显示name字段
- 现在还可以查看
Tags
数据表,还是进行创建数据,发现可以选择Bbb表的数据
- 上面只是配置显示参数,除了这个还可以设置自定义格式,例如:
- 修改TestModel/admin.py文件 from django.contrib import admin from TestModel.models import Aaa,Bbb,Tag # Register your models here. class BbbAdmin(admin.ModelAdmin): fieldsets = ( ['Main',{ 'fields': ('name',), #显示name }], ['Advance',{ 'classes': ('collapse',), #CSS 'fields': ('age',), #隐藏age }] ) admin.site.register(Bbb,BbbAdmin) admin.site.register([Aaa,Tag])
再次访问管理页面,点击刚才创建的数据,可以看到只有name,但是有一个Advance,可以点击显示
(5)内联(lnline)显示
上面中的Bbb数据表,就是Tag数据表的外键,而在默认的页面中,会将两者分开,无法体现出两者的从属关系
根据上述问题,可以使用内联显示,让Tag数据表附加在Bbb的编辑页面上显示,实例:
- 修改TestModel/admin.py文件 from django.contrib import admin from TestModel.models import Aaa,Bbb,Tag # Register your models here. class TagInline(admin.TabularInline): model = Tag #指定数据表 class BbbAdmin(admin.ModelAdmin): inlines = [TagInline] #指定TagInline类 fieldsets = ( ['Main',{ 'fields': ('name',), }], ['Advance',{ 'classes': ('collapse',), 'fields': ('age',), }] ) admin.site.register(Bbb,BbbAdmin) admin.site.register([Aaa])
- 访问进行测试
(6)修改数据表显示
- 现在
Bbb
增加三条数据,可以看到只会这样显示
可以自定义此页面,使之变得更加可视化,例如:
from django.contrib import admin from TestModel.models import Aaa,Bbb,Tag # Register your models here. class TagInline(admin.TabularInline): model = Tag class BbbAdmin(admin.ModelAdmin): list_display = ('name','age') #显示name和age字段 inlines = [TagInline] fieldsets = ( ['Main',{ 'fields': ('name',), }], ['Advance',{ 'classes': ('collapse',), 'fields': ('age',), }] ) admin.site.register(Bbb,BbbAdmin) admin.site.register([Aaa])
- 刷新页面,可以发现能够直接看到字段值
(7)增加搜索功能
- 在数据量增多时,如果想要搜索指定数据,一个一个找肯定是不现实的,可以添加搜索功能,例如:
from django.contrib import admin from TestModel.models import Aaa,Bbb,Tag # Register your models here. class TagInline(admin.TabularInline): model = Tag class BbbAdmin(admin.ModelAdmin): list_display = ('name','age') search_fields = ('name',) #添加搜索功能,搜索参数为name inlines = [TagInline] fieldsets = ( ['Main',{ 'fields': ('name',), }], ['Advance',{ 'classes': ('collapse',), 'fields': ('age',), }] ) admin.site.register(Bbb,BbbAdmin) admin.site.register([Aaa])
- 访问测试