共计 7974 个字符,预计需要花费 20 分钟才能阅读完成。
🔥 邂逅 Django – 目录
✅ Part 1:【邂逅 Django】——(一)创立我的项目
✅ Part 2:【邂逅 Django】——(二)数据库配置
🛠️ Part 3:【邂逅 Django】——(三)视图
🛠️ Part 4:【邂逅 Django】——(四)表单和通用视图
🛠️ Part 5:【邂逅 Django】——(五)欠缺界面(自定义界面和款式)
🛠️ Part 6:【邂逅 Django】——(六)自定义治理界面
🛠️ Part 7:【邂逅 Django】——(七)自动化测试
🎈 前言
本系列文章,在 Django
官网文档教程的根底模板下,进行了肯定的改良和删除,增加了一些本人的见解。
心愿大家看完该系列文章后,对 Django
可能有一个清晰的意识。
路漫漫兮其修远兮,吾将上下而求索!
Django
== 官网文档 ==:https://www.djangoproject.com/
❗ ❗ ❗ 学习过程中,多看官网文档,能够解决很多问题 ❗ ❗ ❗
本教程应用
poetry
对我的项目环境进行治理。
相干poetry
的装置与应用,请参考【Python – 虚拟环境】我的项目的启动,从隔离开发环境开始 – SegmentFault 思否
一、我的项目配置文件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
二、创立模型
定义模型,也就是数据库结构设计和附加的其余元数据。
在这个投票利用中,须要创立两个模型:问题 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
。
迁徙是十分弱小的性能,可能在开发过程中继续的扭转数据库构造而不须要删除表和从新创立表。
它专一于数据库平滑降级而不会失落数据。
扭转模型须要以下步骤:
- 编辑
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()
<QuerySet []> # 目前没有数据
>>> 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()
<QuerySet [<Question: Question object (1)>]>
对于 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?>]>
🌊 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()
<QuerySet [<Question: What's up?>]>
# Django database API:filter
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?>
# 如果数据库中不存在数据,则会抛出异样
>>> Question.objects.get(id=2)
Traceback (most recent call last):
File "<input>", line 1, in <module>
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)
<Question: What's up?>
>>> q = Question.objects.get(pk=1)
# 应用 models.py 中自定义的办法
>>> q.was_published_recently()
True
# 查看 q 对象,外键所对应的对象
>>> q.choice_set.all()
<QuerySet []>
# 给 q 对象增加外键元素
>>> q.choice_set.create(choice_text="Not much", votes=0)
<Choice: Not much>
>>> q.choice_set.create(choice_text="The sky", votes=0)
<Choice: The sky>
>>> c = q.choice_set.create(choice_text="Just hacking again", votes=0)
# 查看 c 元素(Choice 对象)>>> c
<Choice: Just hacking again>
# 查看 c 元素的属性
>>> c.question
<Question: What's up?>
# 查看 q 对象,外键所对应的对象
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()
3
>>> Choice.objects.filter(question__pub_date__year=current_year)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> c = q.choice_set.filter(choice_text__startswith="Just hacking")
# 删除 c 对象
>>> c.delete()
(1, {'polls.Choice': 1})
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>]>
五、Djaong
治理界面
治理界面不是为了网站的访问者,而是为管理者筹备的。
🌊 5.1 创立一个管理员帐号
在命令行运行以下命令:python manage.py createsuperuser
之后会提醒,输出用户名、邮箱、明码、确认明码。
> python manage.py createsuperuser
用户名 (leave blank to use 'administrator'): admin
电子邮件地址: admin@example.com
Password: ******
Password (again): ******
明码长度太短。明码必须蕴含至多 8 个字符。这个明码太常见了。明码只蕴含数字。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/
输出帐号和明码,即可进入治理界面。
🌊 5.3 向治理页面减少投票利用
# polls/admin.py
from django.contrib import admin
from .models import Question
admin.site.register(Question)
🌊 5.4 体验便捷的治理性能
点击页面中的按钮,即可应用增删改查性能。
六、【PyCharm
应用小技巧】
💎 6.1 应用 PyCharm
的工具运行makemigrations & migrate
6.2 应用 PyCharm
运行django shell
在 PyCharm
底部工具栏,抉择 Python Console
即可进入python manage.py shell
。
前提条件:我的项目启动
Django
反对。我的项目启动
Django
反对见:【邂逅 Django】——(一)创立我的项目 – SegmentFault 思否四、【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'
]
如果之前的服务还在运行,刷新页面即可。
总结
本文简略介绍了 Django
与数据库的连贯与应用,默认后盾治理界面的应用。
以及应用 PyCharm
快捷运行 makemigrations & migrate
命令和 django shell
,应用django-simpleui
丑化默认后盾治理界面。