🔥 邂逅Django – 目录
✅ Part 2:【邂逅Django】—— (二)数据库配置
🛠️ Part 3:【邂逅Django】—— (三)视图
🛠️ Part 4:【邂逅Django】—— (四)表单和通用视图
🛠️ Part 5:【邂逅Django】—— (五)完善界面(自定义界面和样式)
🛠️ Part 6:【邂逅Django】—— (六)自定义管理界面
🛠️ Part 7:【邂逅Django】—— (七)自动化测试
🎈 前言
本系列文章,在 Django
官方文档教程的基础模板下,进行了一定的改进和删除,添加了一些自己的见解。
希望大家看完该系列文章后,对 Django
能够有一个清晰的认识。
这是一个漫长的道路,我不会停止追求!
[En]
It’s a long way to go, I won’t stop pursuing it!
Django
官方文档:https://www.djangoproject.com/
❗ ❗ ❗ 学习过程中,多看官方文档,可以解决很多问题 ❗ ❗ ❗
本教程使用
poetry
对项目环境进行管理。
相关poetry
的安装与使用,请参考【Python – 虚拟环境】项目的启动,从隔离开发环境开始 – CoderChaos – 博客园 (cnblogs.com)
一、项目配置文件 settings.py
🌊 1.1 数据库配置
mysite/settings.py
,是个包含了 Django
项目设置的 Python
模块。
数据库的配置,在于变量 DATABASES
。
Django
默认使用 SQLite
作为默认数据库。 Python
内置 SQLite
,所以无需安装额外的东西就可以使用。
如果做一个真正的项目,最好不要使用 SQLite
。
Django 默认使用 SQLite
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
Django使用MySQL配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite', # 使用MySQL时,需要提前在MySQL创建mysite数据库
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': '******'
}
}
参数说明:
default
:Django
连接数据库时,默认链接default
下的数据库。ENGINE
:有多个可选值django.db.backends.sqlite3
django.db.backends.postgresql
django.db.backends.mysql
django.db.backends.oracle
- 其他第三方数据库后端。参考地址
NAME
:数据库的名称。如果使用SQLite
,数据库将是电脑上的一个文件。默认值BASE_DIR / 'db.sqlite3'
,将把数据库存储在项目的根目录。- 其他参数:如果不使用
SQLite
,则必须添加一些额外设置,比如USER
、PASSWORD
、HOST
等等。参考文档
注意:如果使用
SQLite
以外的数据库,需要确认在使用前已经创建了数据库。可以通过在你的数据库交互式命令行中使用CREATE DATABASE database_name;
来完成数据库的创建。
🌊 1.2 时区和语言
可以在 settings.py
文件中,修改时区和语言。
语言
LANGUAGE_CODE = "zh-hans"
时区
TIME_ZONE = "Asia/Shanghai"
🌊 1.3 Django
默认的自带应用简介
settings.py
文件中的一些说明: INSTALLED_APPS
INSTALLED_APPS 默认包括以下 Django 的自带应用:
django.contrib.admin
:管理员站点django.contrib.auth
:认证授权系统django.contrib.contenttypes
:内容类型框架django.contrib.sessions
:会话框架django.contrib.messages
:消息框架django.contrib.staticfiles
:管理静态文件的框架
默认开启的某些应用需要至少一个数据表,所以,在使用它们之前需要在数据库中创建一些表。需要执行以下命令: python manage.py migrate
二、创建模型
定义模型,即数据库结构设计和附加元数据。
[En]
Define the model, that is, the database structure design and additional metadata.
在这个投票应用中,需要创建两个模型:问题 Question
和选项 Choice
。
Question
模型包括问题描述和发布时间。Choice
模型包括选项描述和当前得票数。每个选项属于一个问题。
polls/models.py
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField("发布日期")
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
创建模型,继承 django.db.models.Model
;每个模型有许多类变量,都表示模型里的一个数据表字段。
每个字段都是 Field
类的实例。
说明:
Django
可以为应用创建数据库表(CREATE TABLE
)Django
可以创建与Question
和Choice
对象进行交互的Python
数据库API
三、激活模型
Django
应用是”可插拔”的。
添加 polls
应用
mysite/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls',
# 或'polls.apps.PollsConfig',
]
现在, Django
项目已经包含 polls
应用。
运行命令 makemigrations
,进行一次迁移: python manage.py makemigrations
运行 makemigrations
命令, Django
会检测模型文件的修改,并且把修改的部分存储为一次迁移。迁移是 Django
对数据结构变化的一次存储。
migrate
是自动执行数据库迁移并同步管理数据库结构的命令。
因此,执行 makemigrations
之后,要想修改在数据库做出同步,需要再次执行 python manage.py migrate
。
迁移是非常强大的功能,能够在开发过程中持续的改变数据库结构而不需要删除表和重新创建表。
它专注于平稳的数据库升级,而不会丢失数据。[En]
It focuses on smooth database upgrades without losing data.
改变模型需要以下步骤:
- 编辑
models.py
文件,改变模型 - 运行
python manage.py makemigrateions
为模型的改变生成迁移文件 - 运行
python manage.py migrate
应用数据库迁移
四、初试API
🌊 4.1 Django
交互式命令的基本使用
进入 Django
交互式命令行: python manage.py shell
>>> from polls.models import Choice, Question
查看表Question表中的数据
>>> Question.objects.all()
# 目前没有数据
>>> from django.utils import timezone
创建一个Question数据对象
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
存储数据对象到数据库
>>> q.save()
查看 q 对象属性
>>> q.id
1
>>> q.question_text
"What's' new?"
>>> q.pub_date
datetime.datetime(2022, 3, 20, 11, 29, 15, 780052, tzinfo=datetime.timezone.utc)
修改 q 对象的属性
>>> q.question_text = "What's up?"
>>> q.save()
再次查看 Question 表中的数据
>>> Question.objects.all()
]>
对于 Question
返回的显示数据,可以通过编辑 Question
模型代码进行修改,给 Question
和 Chioce
增加 __str__()
方法。
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField("发布日期")
def __str__(self):
return self.question_text
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
再次进入Django交互式命令行: python manage.py shell
Question.objects.all()
<queryset [<question: what's up?>]>
</queryset>
🌊 4.2 给模型添加自定义方法
import datetime
from django.db import models
from django.utils import timezone
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField("发布日期")
def __str__(self):
return self.question_text
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
再次进入Django交互式命令行: python manage.py shell
>>> from polls.models import Question, Choice
查看 __str__() 是否已生效
>>> Question.objects.all()
]>
Django database API:filter
>>> Question.objects.filter(id=1)
]>
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
如果数据库中不存在任何数据,则会引发异常<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>If no data exists in the database, an exception is thrown</font>*</details>
>>> Question.objects.get(id=2)
Traceback (most recent call last):
File "", line 1, in
File "D:\Codes\media\django\code001\venv\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "D:\Codes\media\django\code001\venv\lib\site-packages\django\db\models\query.py", line 496, in get
raise self.model.DoesNotExist(
polls.models.Question.DoesNotExist: Question matching query does not exist.
通过主键获取数据对象
>>> Question.objects.get(pk=1)
>>> q = Question.objects.get(pk=1)
使用 models.py 中自定义的方法
>>> q.was_published_recently()
True
查看 q 对象,外键所对应的对象
>>> q.choice_set.all()
给 q 对象添加外键元素
>>> q.choice_set.create(choice_text="Not much", votes=0)
>>> q.choice_set.create(choice_text="The sky", votes=0)
>>> c = q.choice_set.create(choice_text="Just hacking again", votes=0)
查看 c 元素(Choice 对象)
>>> c
查看 c 元素的属性
>>> c.question
查看 q 对象,外键所对应的对象
>>> q.choice_set.all()
, , ]>
>>> q.choice_set.count()
3
>>> Choice.objects.filter(question__pub_date__year=current_year)
, , ]>
>>> c = q.choice_set.filter(choice_text__startswith="Just hacking")
删除 c 对象
>>> c.delete()
(1, {'polls.Choice': 1})
>>> q.choice_set.all()
, ]>
五、 Djaong
管理界面
管理界面不是为网站访问者提供的,而是为管理人员提供的。
[En]
The management interface is not for visitors to the site, but for managers.
🌊 5.1 创建一个管理员帐号
在命令行运行以下命令: python manage.py createsuperuser
之后,系统将提示您输入用户名、邮箱、密码和确认密码。
[En]
After that, you will be prompted to enter your user name, mailbox, password, and confirm password.
> python manage.py createsuperuser
用户名 (leave blank to use 'administrator'): admin
电子邮件地址: admin@example.com
Password: ******
Password (again): ******
密码长度太短。密码必须至少包含8个字符。<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>The password length is too short. The password must contain at least 8 characters.</font>*</details>
这个密码太常见了。
密码只包含数字。
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
🌊 5.2 登录管理界面
启动开发服务器: python manage.py runserver
打开浏览器:http://127.0.0.1:8000/admin/
输入帐号和密码即可进入管理界面。
[En]
Enter your account number and password to enter the management interface.
🌊 5.3 向管理页面增加投票应用
polls/admin.py
from django.contrib import admin
from .models import Question
admin.site.register(Question)
🌊 5.4 体验便捷的管理功能
点击页面上的按钮可使用添加、删除、修改和搜索功能。
[En]
Click the button on the page to use the add, delete, modify and search function.
六、【 PyCharm
使用小技巧】
💎 6.1 使用 PyCharm
的工具运行 makemigrations & migrate
6.2 使用 PyCharm
运行 django shell
在 PyCharm
底部工具栏,选择 Python Console
即可进入 python manage.py shell
。
前提条件:项目启动
Django
支持。
项目启动Django
支持见:【邂逅Django】——(一)创建项目 – CoderChaos – 博客园 (cnblogs.com)
四、【PyCharm 使用小技巧】
相比于从 Terminal
通过 python manage.py shell
进入 Django shell
,输入会有一定的提示。
七、最简单的美化Django Admin
💎 7.1 simpleui
简介
Django Admin默认界面设计语言存在着的一些不足,比如色彩单一,大量线条的使用,分割化明显。将这些不足归类一下就是界面单调、雷同性明显、缺少惊喜。
simpleui
:一款基于vue+element-ui的django admin现代化主题。
GitHub地址:https://github.com/newpanjing/simpleui
💎 7.2 simpleui
使用
✨ 7.2.1 安装
poetry add -D django-simpleui
✨ 7.2.2 开始使用
安装完成后,在自己项目的 settings.py
文件中 INSTALLED_APPS
的 第一行
加入simpleui。
settings.py
INSTALLED_APPS = [
'simpleui',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls'
]
如果之前的服务仍在运行,只需刷新页面即可。
[En]
If the previous service is still running, just refresh the page.
总结
本文简单介绍了 Django
与数据库的连接与使用,默认后台管理界面的使用。
以及使用 PyCharm
快捷运行 makemigrations & migrate
命令和 django shell
,使用 django-simpleui
美化默认后台管理界面。
Original: https://www.cnblogs.com/CoderChaos/p/16433491.html
Author: CoderChaos
Title: 【邂逅Django】——(二)数据库配置
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/499171/
转载文章受原作者版权保护。转载请注明原作者出处!