文章目录
- 一、概述
- 二、使用管理工具
- (1)激活管理工具
- (2)使用管理工具
- (3)复杂模型
- (4)自定义表单
- (5)内联(lnline)显示
- (6)修改数据表显示
- (7)增加搜索功能
此文章参考菜鸟教程:Django Admin 管理工具 | 菜鸟教程 (runoob.com)
Django版本:
>>> django.VERSION
(4, 1, 0, 'final', 0)
PS:基于前几章的进度进行修改
一、概述
-
使用Django Admin可以快速对数据库的各个数据表进行增删查改。
一行代码即可增加对一个模型(数据表)的增删查改。
试想如果你要自己手动编写后台对一个模型进行增删查改,你一般需要4个urls, 4个视图函数或通用视图和4个模板。当一个项目比较大包含多个app时,而每个app又包含多个模型(数据表)
时, 那么编写和维护整个项目管理后台的工作量可想而知。
Django Admin所做就是将所有需要管理的模型(数据表)集中在一个平台,你不仅可以选择性地管理模型(数据表), 你还可以快速订制数据条目查询,过滤和搜索条件。
-
Django提供了基于Web的管理工具,这个管理工具是django.contrib
的一部分,可以在项目的settings.py
中的INSTALLED_APPS
看到
-
django.contrib
是一套庞大的功能集,它是Django基本代码的组成部分
- /helloworld/helloworld/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'TestModel',
]
二、使用管理工具
(1)激活管理工具
- 在生成项目时,urls.py文件会自动设置好管理工具,资源路径为
admin/
,只需要去掉注释即可
- helloworld/urls.py
from django.urls import path,include
from django.contrib import admin
urlpatterns = [
path('admin/',admin.site.urls),
]
- 我们可以通过命令
python manage.py createsuperuser
创建超级用户:
(test) PS F:\django\helloworld> python .\manage.py createsuperuser
用户名 (leave blank to use 'root'): admin
电子邮件地址: admin@163.com
Password:
Password (again):
Superuser created successfully.
(test) PS F:\django\helloworld> python .\manage.py runserver 0.0.0.0:8000
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
September 02, 2022 - 16:09:39
Django version 4.1, using settings 'helloworld.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CTRL-BREAK.
- 再次访问
127.0.0.1:8000/admin
,输入刚刚创建的用户名密码
(2)使用管理工具
- 成功进入后,发现没任何数据表,这是因为还需要注册该数据模型到
admin
,现在先创建数据表
注意:需要先连接到mysql数据,可以参考之前模型那章
(test) PS F:\django\helloworld> django-admin startapp TestModel
(test) PS F:\django\helloworld> ls
目录: F:\django\helloworld
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2022/8/17 14:17 helloworld
d----- 2022/8/18 10:45 static
d----- 2022/8/17 14:17 templates
d----- 2022/8/18 13:57 TestModel
-a---- 2022/8/17 10:49 0 db.sqlite3
-a---- 2022/8/17 10:49 688 manage.py
(test) PS F:\django\helloworld> cd TestModel
(test) PS F:\django\helloworld\TestModel> ls
目录: F:\django\helloworld\TestModel
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2022/8/18 13:57 migrations
-a---- 2022/8/18 13:57 66 admin.py
-a---- 2022/8/18 13:57 156 apps.py
-a---- 2022/8/18 13:57 60 models.py
-a---- 2022/8/18 13:57 63 tests.py
-a---- 2022/8/18 13:57 66 views.py
-a---- 2022/8/18 13:57 0 __init__.py
from django.db import models
class Aaa(models.Model):
name = models.CharField(max_length=20)
age = models.CharField(max_legth=3)
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'TestModel',
]
(test) PS F:\django\helloworld> python manage.py migrate
- 执行上面的命令后,查看mysql数据库,可以发现已经创建了数据表
mysql> show tables;
+----------------------------+
| Tables_in_test |
+----------------------------+
| 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 |
+----------------------------+
10 rows in set (0.00 sec)
- 下面来创建TestModel模型的表
(test) PS F:\django\helloworld> python manage.py makemigrations TestModel
- Create model Aaa
(test) PS F:\django\helloworld> python manage.py migrate TestModel
Applying TestModel.0001_initial... OK
- 再次查看数据库,发现创建了TestModel_aaa 表
mysql> show tables;
+----------------------------+
| Tables_in_test |
+----------------------------+
| TestModel_aaa |
| 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 |
+----------------------------+
11 rows in set (0.00 sec)
- 查看表结构,可以看到 id 字段为主键
mysql> show create table TestModel_aaa;
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TestModel_aaa | CREATE TABLE `TestModel_aaa` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`age` varchar(3) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> describe TestModel_aaa;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| age | varchar(3) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
from django.contrib import admin
from TestModel.models import Aaa
admin.site.register([Aaa])
- 启动django,再次访问admin管理页面,可以发现刚刚创建的数据表已经注册成功
- 可以发现,字段都是对应的,填写字段数据,然后点击
保存
,会提示成功添加
注意:id的值是自增,因为是django默认增加的主键,所以这里只有name和age两个字段
- 去数据库中查看,可以发现上面图片的
object(7)
和数据表中id字段的值7
是对应的,就表示,已经增加过7条数据了
(3)复杂模型
- 管理页面可以处理更加复杂的数据模型,如外外键约束等,实例:
- 修改models.py文件,创建三个表,一个表使用外键约束
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
admin.site.register([Aaa,Bbb,Tag])
- 启动django,查看Admin管理平台,发现注册成功
(4)自定义表单
- 修改TestModel/admin.py文件
from django.contrib import admin
from TestModel.models import Aaa,Bbb,Tag
class BbbAdmin(admin.ModelAdmin):
fields = ('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
class BbbAdmin(admin.ModelAdmin):
fieldsets = (
['Main',{
'fields': ('name',),
}],
['Advance',{
'classes': ('collapse',),
'fields': ('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
class TagInline(admin.TabularInline):
model = Tag
class BbbAdmin(admin.ModelAdmin):
inlines = [TagInline]
fieldsets = (
['Main',{
'fields': ('name',),
}],
['Advance',{
'classes': ('collapse',),
'fields': ('age',),
}]
)
admin.site.register(Bbb,BbbAdmin)
admin.site.register([Aaa])
(6)修改数据表显示
from django.contrib import admin
from TestModel.models import Aaa,Bbb,Tag
class TagInline(admin.TabularInline):
model = Tag
class BbbAdmin(admin.ModelAdmin):
list_display = ('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
class TagInline(admin.TabularInline):
model = Tag
class BbbAdmin(admin.ModelAdmin):
list_display = ('name','age')
search_fields = ('name',)
inlines = [TagInline]
fieldsets = (
['Main',{
'fields': ('name',),
}],
['Advance',{
'classes': ('collapse',),
'fields': ('age',),
}]
)
admin.site.register(Bbb,BbbAdmin)
admin.site.register([Aaa])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)