邂逅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 默认应用 SQLiteDATABASES = { '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.pyfrom django.db import modelsclass 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.pyINSTALLED_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.id1>>> q.question_text"What's' new?">>> q.pub_datedatetime.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_textclass 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 datetimefrom django.db import modelsfrom django.utils import timezoneclass 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.comPassword: ******Password (again): ******明码长度太短。明码必须蕴含至多 8 个字符。这个明码太常见了。明码只蕴含数字。Bypass password validation and create user anyway? [y/N]: ySuperuser created successfully.
5.2 登录治理界面
启动开发服务器:python manage.py runserver
关上浏览器:http://127.0.0.1:8000/admin/
输出帐号和明码,即可进入治理界面。
5.3 向治理页面减少投票利用
# polls/admin.pyfrom django.contrib import adminfrom .models import Questionadmin.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.pyINSTALLED_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
丑化默认后盾治理界面。