Django(7)Admin管理工具

2023-05-16

文章目录

  • 一、概述
  • 二、使用管理工具
    • (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
#-*- coding: utf-8 -*-
from django.urls import path,include
from django.contrib import admin


urlpatterns = [
    path('admin/',admin.site.urls),
]
  • 启动Django

在这里插入图片描述

  • 访问127.0.0.1:8000/admin/

在这里插入图片描述

  • 我们可以通过命令python manage.py createsuperuser创建超级用户:
(test) PS F:\django\helloworld> python .\manage.py createsuperuser
用户名 (leave blank to use 'root'): admin  #输入用户名
电子邮件地址: admin@163.com  #邮箱地址
Password:    #密码123456.com
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  #创建数据模型,数据模型为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  #创建了一个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

  • 修改Model文件
from django.db import models

class Aaa(models.Model):  #创建数据表,最终表名称为TestModel_aaa
    name = models.CharField(max_length=20)  #两个字段,name和age,最终创建出还有一个id的主键字段
    age = models.CharField(max_legth=3)
  • 修改主app的settings.py文件
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'TestModel',  #添加新的app
]
  • 执行修改操作
(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)

  • 修改TestModel/admin.py文件
from django.contrib import admin
from TestModel.models import Aaa  #导入模块
# Register your models here.

admin.site.register([Aaa])   #注册数据表
  • 启动django,再次访问admin管理页面,可以发现刚刚创建的数据表已经注册成功

在这里插入图片描述

  • 点进入数据表可以直接进行修改

在这里插入图片描述

  • 点击增加AAA

在这里插入图片描述

  • 可以发现,字段都是对应的,填写字段数据,然后点击保存,会提示成功添加

注意:id的值是自增,因为是django默认增加的主键,所以这里只有name和age两个字段

在这里插入图片描述

在这里插入图片描述

  • 去数据库中查看,可以发现上面图片的object(7)和数据表中id字段的值7是对应的,就表示,已经增加过7条数据了
    在这里插入图片描述

(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表示在关联数据表字段做出操作时,自身表做的操作
  1. CASCADE:默认选项,表示级联删除
  2. PROTECT:保护模式,使用该选项,在删除时,会抛出ProtectedError的错误
  3. SET_NULL:置空模式,删除时,外键字段被设置为空,前提是blank=Truenull=True,定义该字段时,需要外键允许为空
  4. SET_DEFAULT:删除时,外键字段设置为默认值,使用该选项时,需要注意外键的上一个默认值
  5. SET( ):括号里可以是函数,设置自定义的值
  6. 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])
  • 访问测试

在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django(7)Admin管理工具 的相关文章

随机推荐

  • RHEL本地登录login出现permission denied的可能的解决办法

    OS xff1a RHEL7 6 开机后发现在本地使用root和非root用户登录 xff0c 输入用户名密码后 xff0c 都会出现permission denied xff0c 没有办法进入到系统 在网上查了很多资料 xff0c 看到这
  • Updating crates.io index 速度慢的解决办法

    Rust社区公开的第三方包都集中在crates io网站上面 xff0c 他们的文档被自动发布到doc rs网站上 Rust提供了非常方便的包管理器cargo xff0c 它类似于Node js的npm和Python的pip 但cargo不
  • SecureCRT 密码解密

    SecureCRT xff08 8 以上 xff09 配置的密码存放在 Config Sessions下面的ini文件中 xff0c 内容如下 xff1a S Username 61 S Monitor Password V2 61 S P
  • AD10 四层板经验(层的性质)

    层的性质 xff1a 内部层有两种 xff1a plane和layer xff0c 他们的区别如下 xff1a plane是所有Layer的其中一个 xff0c Layer是指层 xff0c 例如有常见的信号层Signal Layers 顶
  • Centos7下httpd最新版本安装或者更新至最新版本

    查找Centos上软件库里的httpd版本 yum info httpd yum info httpd 已加载插件 xff1a fastestmirror Loading mirror speeds from cached hostfile
  • 修改git远程仓库地址

    由于git仓库的地址发生了变化 xff0c 需要修改仓库地址才能push 查看本地工程git仓库关联的远程仓库地址 xff1a span class token function git span remote v 删除本地关联的远程仓库地
  • INSTALL_FAILED_NO_MATCHING_ABIS 的解决办法

    在Android模拟器上安装apk的时候出现 xfeff xfeff INSTALL FAILED NO MATCHING ABIS 这个错误提示的解决办法 是由于使用了native libraries 该native libraries
  • IntelliJ IDEA 控制台中文乱码

    1 预热 刚刚接触IntelliJ IDEA几天 xff0c 在易用性方面的确比Eclipse好很多 xff0c 比较智能 xff0c 各种插件 工具都已经集成 xff0c 和Mac OS X类似 开箱即用 但是还是老大难问题 中文乱码 x
  • unable to start the monitor on 4454 ,an other instance is problaly using the same port

    在打开idea studio后 xff0c 再打开android studio xff0c 或者反过来 xff0c 打开项目的时候就会报 xff1a unable to start the monitor on 4454 xff0c an
  • windows中为cmd设置代理

    在CMD环境下设置代理可能不是很常用 xff0c 但是某些情况下还是可能会用到 xff0c 比如有些资源网站被墙了 xff0c 此时你如果想访问这些资源时 xff0c 只能通过代理来访问相应的资源 xff0c 而你需要在CMD环境下下载墙外
  • version `GLIBCXX_3.4.21' not found 解决办法

    在安装cmake3 5 1运行 bootstrap的时候出现如下提示 xff1a gmake cmake 是最新的 span class hljs header usr soft cmake 3 5 1 Bootstrap cmk cmak
  • Oracle死锁查询及处理

    一 数据库死锁的现象 程序在执行的过程中 xff0c 点击确定或保存按钮 xff0c 程序没有响应 xff0c 也没有出现报错 二 死锁的原理 当对于数据库某个表的某一列做更新或删除等操作 xff0c 执行完毕后该条语句不提 交 xff0c
  • Ubuntu 18.04添加中文输入法

    找到设置 xff1a 点击 Manager Installed Languages 出现下图提示 xff1a Keyboard input method system 里面有Ibus XIM fcitx none 三种输入架构 xff0c
  • KEIL问题【打开文件太多造成任何按钮都不可点】【Keil4 编译时出现RL-ARM is not allowed with this license 】【 局部变量仿真显示not in scope】

    SYD8801是一款低功耗高性能蓝牙低功耗SOC xff0c 集成了高性能2 4GHz射频收发机 32位ARM Cortex M0处理器 128kB Flash存储器 以及丰富的数字接口 SYD8801片上集成了Balun无需阻抗匹配网络
  • Django(2)模板、标签

    文章目录 一 使用Django模板修改页面二 Django模板标签 变量 列表 字典 过滤器1 default2 length3 filesizeformat4 date5 truncatechars6 safe if else标签 for
  • Django(3)模型

    文章目录 一 Django 模型 ORM二 数据库配置三 定义模型 xff08 创建数据表 xff09 四 数据库基本操作 插入数据 获取数据 xff08 1 xff09 查询所有的数据行 xff08 2 xff09 where条件查询 x
  • Django(4)表单

    文章目录 一 概述二 GET方法三 POST方法四 Request对象五 QueryDict对象 此文章参考菜鸟教程 xff1a Django 表单 菜鸟教程 runoob com Django版本 xff1a span class tok
  • Django(5)视图

    文章目录 一 视图概述二 请求对象HttpRequest xff08 1 xff09 GET xff08 2 xff09 POST xff08 3 xff09 body xff08 4 xff09 path xff08 5 xff09 me
  • Django(6)路由

    文章目录 一 路由概述二 正则路径中的分组 xff08 1 xff09 正则路径中的无名分组 xff08 2 xff09 正则路径中的有名分组 xff08 3 xff09 路由分发 三 反向解析 xff08 使用reverse xff09
  • Django(7)Admin管理工具

    文章目录 一 概述二 使用管理工具 xff08 1 xff09 激活管理工具 xff08 2 xff09 使用管理工具 xff08 3 xff09 复杂模型 xff08 4 xff09 自定义表单 xff08 5 xff09 内联 xff0