开发环境:

  • Microsoft Windows 10 Enterprise LTSC [Version 10.0.19044.1586], locale zh-CN

  • Python 3.8.10

  • PyCharm 2021.2 (Professional Edition)

  • Visual Studio Code, 64-bit edition (version 1.67.2)


在项目内创建应用

在项目文件夹中按住键盘的 Shift, 点鼠标 右键, 选择 在此处打开PowerShell窗口

创建应用的命令: python manage.py startapp <应用名称>

1
2
(venv) PS D:\PycharmProjects\myproject> python .\manage.py startapp department
(venv) PS D:\PycharmProjects\myproject>

添加 users 应用后的项目结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-- myproject
|-- manage.py
|-- myproject
| |-- __init__.py
| |-- __pycache__
| |-- asgi.py
| |-- settings.py
| |-- urls.py
| `-- wsgi.py
|-- templates
|-- department 新创建的应用名称
| |-- __init__.py 包初始化文件
| |-- admin.py django内置的应用程序Django Admin的配置文件
| |-- apps.py 应用程序本身的配置文件
| |-- migrations 数据迁移文件夹
| |-- models.py 数据库模型类文件
| |-- tests.py 单元测试文件
| `-- views.py 视图文件
`-- venv

配置项目用于 启用 新创建的应用

打开 myproject/settings.py 文件, 找到 INSTALLED_APPS 变量, 将新应用添加到 INSTALLED_APPS 变量的应用列表中(以下方法 二选一):

  1. 使用 应用名称 安装应用到项目中
1
2
3
4
5
6
7
8
9
10
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',

'department', # 通过 应用名 安装应用, 适用于大多数情况
]
  1. 使用 应用的配置文件 安装应用到项目中
1
2
3
4
5
6
7
8
9
10
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',

'department.apps.UsersConfig', # 通过应用的配置文件安装应用, 适用于 新应用有自定义的配置信息
]

每个 应用(app) 也有自己的 配置信息,放在 apps.py 里的。在大多数情况下,把 app名 直接加入到 INSTALLED_APPS 就足够了。只有当你需要给 app自定义配置 信息时,需要把加入 应用(app) 对应的 AppConfig子类 路径直接加入到 INSTALLED_APPS

添加到 INSTALLED_APPS 变量列表中的应用才能实现 数据迁移

为新应用添加一个视图

打开 department/views.py 文件, 编辑内容如下:

1
2
3
4
5
6
from django.shortcuts import render
from django.http import HttpResponse


def index(request):
return HttpResponse('Hello, World!')

管理新应用的路由(url)

department 文件夹添加名为 urls.pyPython File, 编辑内容如下:

1
2
3
4
5
6
from django.urls import path
from . import views

urlpatterns = [
path('', views.index, name='index'),
]

注册新应用的路由到项目中

打开 myproject/urls.py 文件, 编辑内容如下:

1
2
3
4
5
6
7
8
9
10
from django.contrib import admin
from django.urls import path, include # 添加 include 的导入

urlpatterns = [
path('admin/', admin.site.urls),

# 添加应用的urls, department.urls: 子应用的 urls.py 文件路径
path('department/', include('department.urls')),
]

显示视图的运行结果

在浏览器的地址栏输入URL: http://127.0.0.1:8000/department/

使用模型(Model)

Django 通过内置的 ORM 实现对数据库的操作, 每个模型类对应于数据库中的一个表

定义 组织结构 模型类

打开 department/models.py 文件, 编辑内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from django.db import models


class Department(models.Model):
"""
组织架构:用于保存有关联业务的其他公司 或 单位内部的部门信息
"""

# 组织架构选项
type_choices = (('firm', '公司'), ('department', '部门'))
# max_length: 最大长度; verbose_name: 字段备注名
title = models.CharField(max_length=60, verbose_name="名称")
type = models.CharField(max_length=20, choices=type_choices,
default='department', verbose_name='类型')
# null=True: 空值时存为null; blank=True: 允许为空;
description = models.CharField(max_length=200, null=True,
blank=True, verbose_name='描述')
# ForeignKey: 关联关系; on_delete=models.CASCADE: 级联操作,外键表随主键表更新
parent = models.ForeignKey('self', null=True, blank=True,
verbose_name='上级部门', on_delete=models.CASCADE)

class Meta:
verbose_name = '组织构架' # 对象的可读名称, 单数
verbose_name_plural = verbose_name # 对象的可读名称, 复数

def __str__(self):
"""
返回对象的描述信息
"""
return self.title

所有模型都是django.db.models.Model类的子类。每个类将被转换为 数据库表。每个字段由 django.db.models.Field子类(内置在Django core)的实例表示, 它们并将被转换为数据库的列

字段 CharField, DateTimeField等,都是 django.db.models.Field 的子类,包含在Django core 里面, 随时可以使用

CharField 必须设定一个 max_length

ForeignKey 引用它关联的模型(数据库外键), 在新版 Django 中, ForeignKey 必须包含 on_delete 属性

不包含 blank=True 属性的为 必填字段

迁移模型

迁移模型是告诉 Django 通过模型类来创建对应的数据库表, 以便可以使用数据库来存储数据

manage.py 文件所在的文件夹 打开PowerShell窗口, 激活虚拟环境, 执行命令:python manage.py makemigrations

1
2
3
4
(venv) PS D:\PycharmProjects\myproject> python .\manage.py makemigrations
Migrations for 'department':
department\migrations\0001_initial.py
- Create model Structure

命令执行完毕后, 会生成文件 department\migrations\0001_initial.py, 它代表了应用程序模型的当前状态

将生成的迁移文件应用到数据库

继续执行命令: python manage.py migrate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(venv) PS D:\PycharmProjects\myproject> python .\manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, department
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 admin.0003_logentry_add_action_flag_choices... 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 auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK
Applying department.0001_initial... OK

执行迁移数据库操作的时候, 会处理 INSTALLED_APPS 变量中的所有应用的 模型类, 所以除了上面的自下定义模型, 生成的数据库表也包含了项目自带的其他数据表。而 没有添加INSTALLED_APPS 变量中的应用, 将 不会 被处理。

查看迁移后生成的数据库

打开 MySQL 数据库客户端, 选择当前项目使用的数据库, 查看生成的数据表, 如下图所示:

修改数据库

当模型类修改后,则数据库与模型类不再匹配,此时需要重新执行以下两个命令, 生成修改后的迁移文件以及应用到数据库即可。

python manage.py makemigrations

python manage.py migrate

如果模型类的修改比较大, 并且数据库中对应的表已经保存的数据, 以上两个命令执行后可能会出现异常, 可以直接在MySQL数据库的 客户端 中删除数据库, 然后重建 同名数据库, 再执行以上两个命令

使用内置的后台管理功能

Django 已经配置了 Django Admin, 添加 超级管理员 用户并配置 Django Admin, 就可以用来维护应用程序了

创建超级用户

执行命令: python manage.py createsuperuser

1
2
3
4
5
6
(venv) PS D:\PycharmProjects\myproject> python .\manage.py createsuperuser
用户名 (leave blank to use 'laohoo'): admin
电子邮件地址: admin@163.com
Password:
Password (again):
Superuser created successfully.

按命令执行后的提示分别输入用户名, 电子邮箱, 密码确认密码。 其中 密码 有复杂度的要求

管理员登录

在浏览器中打开URL:http://127.0.0.1:8000/admin/

输入用户名密码登录到管理界面

添加模型到管理界面

打开 department/admin.py 文件,并添加以下代码:

1
2
3
4
5
from django.contrib import admin
from .models import Department

admin.site.register(Department)

刷新网页

添加新的组织架构(部门)

添加成功

定制后台管理界面

Django 允许对后台管理界面显示的模型数据进行定制

  1. 打开 department/admin.py文件, 修改如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from django.contrib import admin
from .models import Department


class DepartmentAdmin(admin.ModelAdmin):
# 显示的字段名列表
list_display = ('title', 'type', 'description',)
# 可过滤的字段名列表
list_filter = ('title', 'type',)
# 可搜索的字段名列表
search_fields = ('title', 'description',)
# 启用排序功能的字段
ordering = ['title']


admin.site.register(Department, DepartmentAdmin)

  1. 保存文件后,刷新网页,即可看到定制后的管理界面显示效果

参考资料:

  1. Django v4.0 中文文档

  2. Django入门与实践教程

  3. Bootstrap5 中文手册

===END===