Django是劳伦斯出版集团的开发人员为开发新闻内容网站而设计出来的一个软件,它遵循MVC思想,但是有自己的一个名词,叫做MVT。
Django遵循快速开发和DRY原则。Do not repeat yourself.不要自己去重复一些工作。
它提供了许多有用的工具和功能,使开发者能够轻松地构建高度可拓展、安全、高性能的 Web 应用。
以下是一些 Django 框架的主要特点:
MVT 模型是 Django 框架中的一种设计模式,用于组织和管理 Web 应用的结构和业务逻辑。MVT 是指 Model(模型)、View(视图)、Template(模板)。
以下是 MVT 模型中的各个组件的功能和职责:
Python的虚拟环境是一个独立的、隔离的Python开发环境,它允许您在同一系统上同时管理多个不同的Python项目,每个项目都可以有自己的依赖包和配置。使用虚拟环境可以避免不同项目之间的包冲突,并提供了一种干净的开发环境。
通过创建虚拟环境,您可以在其中安装和管理特定于每个项目的Python包和依赖项,而不会干扰系统级Python安装和其他项目的依赖项。这样可以确保项目在不同环境下的一致性,并提供更好的隔离性和可移植性。
Python有多种工具可以创建和管理虚拟环境,最常用的是venv模块(自Python 3.3开始内置)和第三方工具如virtualenv和conda。使用这些工具,您可以在您选择的目录中创建一个独立的Python环境,并在其中安装所需的库和工具。
创建虚拟环境后,您可以激活它并在其中运行Python解释器,然后您在该环境中安装的所有软件包和依赖项都将在该环境中使用。这使得您可以在不同的项目之间切换,而无需担心包版本冲突或项目特定的配置问题。
总结来说,Python的虚拟环境是一种用于在同一系统上隔离管理多个Python项目的机制,它提供了依赖包隔离、环境隔离和更好的项目管理能力。这是Python开发中的重要工具,尤其是在大型项目或需要使用不同Python版本的项目中。
(1) 在Linux系统上的安装步骤:
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
(2) 在Mac上的安装步骤:
export WORKON_HOME=$HOME/.virtualenvs
source /Library/Frameworks/Python.framework/Versions/3.11/bin/virtualenvwrapper.sh
注意:如果您使用 pip 命令以系统管理员身份(使用 sudo)安装了 virtualenvwrapper,它通常会被安装在pip命令所在的Python版本的路径下。例如我的python3.11.4是在/Library/Frameworks/Python.framework/目录下。如果不确定pip命令安装virtualenvwrapper时的安装路径和版本可以通过下面命令查找.
查看版本:
使用pip list 或者 pip freeze, 例如:
查看路径使用pip show, 例如:
6. 使用source .bash_profile使其生效一下。
如果遇到下面的问题:
可以看到 Python 虚拟环境所用的 Python 解释器路径为 /System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python,而 virtualenvwrapper.sh 文件无法从该路径中导入所需的模块。
解决这个问题的方法是,确保您的 virtualenvwrapper 是针对您所使用的 Python 版本进行安装的,并使用相应的 Python 解释器来加载 virtualenvwrapper。
我这边可以很明确的知道virtualenvwrapper是安装在python3.11.4版本下的, 因此按照错误提示,我们需要修改VIRTUALENVWRAPPER_PYTHON的环境变量,将其指定到python3.11.4的解释器上, 继续编辑~/.bash_profile文件添加下面环境变量
export VIRTUALENVWRAPPER_PYTHON=/Library/Frameworks/Python.framework/Versions/3.11/bin/python3
当您在创建和管理虚拟环境时,virtualenvwrapper 会使用该环境变量中指定的 Python 解释器来运行虚拟环境。通过设置正确的 VIRTUALENVWRAPPER_PYTHON 环境变量,您可以确保 virtualenvwrapper 使用您希望的特定 Python 版本。
完成设置后,再次执行source ~/.bash_profile, 看到下面提示说明成功了.
此时会发现~/.virtualevns目录下多了很多文件,这些文件夹是 virtualenvwrapper 的一部分,用于存储关于虚拟环境的信息和自定义脚本。以下是其中一些文件和文件夹的说明:
1.创建虚拟环境
mkvirtualenv -p python3 bj11_py3
上面的命令是使用 virtualenvwrapper 创建名为 bj11_py3 的虚拟环境,使用 Python 3 解释器的命令。
这个命令的各个部分的含义:
2.进入虚拟环境
workon bj11_py3
这样就可以进入刚刚创建的Python虚拟环境了.
注意: 在激活(或进入)虚拟环境后,您可以执行的所有命令都将在该虚拟环境中执行。例如你在虚拟环境中执行which Python命令,查看当前的Python命令路径会显示为虚拟环境下的Python路径, 如下图所示:
3. 退出虚拟环境
deactivate
运行上面命令可以退出当前进入的虚拟环境
4.删除虚拟环境
rmvirtualenv bj11_py3
运行上面命令将会删除bj11_py3虚拟环境 ,同时也会删除在~/.virtualenvs目录下创建bj11_py3文件夹
5.虚拟环境下安装包
pip install 包名
注意:不能使用sudo pip install 包名,这个命令会把包安装到真实的主机环境上而不是安装到虚拟环境中。
虚拟环境下安装的包会存在虚拟环境/lib/pythonxxx/site-packages目录下
6.查看虚拟环境下所安装的包
pip list 或者 pip freeze
例如新创建的虚拟环境默认会有安装下面的包
进入到Python的虚拟环境中执行安装, 安装的方式还是使用pip命令安装, 只是在虚拟环境下执行, 会将安装包安装到虚拟环境的对应目录下, 例如:
workon bj11_py3 # 进入bj11_py3虚拟环境
pip install django # 开始安装django
上面方式安装包会安装最新的版本(当前最新版本是4.2.4), 如果要指定安装对应的版本,可以这样
pip install django==1.8.2 # 指定安装1.8.2版本的django
注意:
安装同一个包的多个版本, 后面安装的版本会覆盖前面安装的版本.
安装完后, 就可以在虚拟环境的找到django包了
使用命令:django-admin startproject [项目名] 注意:创建应用必须先进入虚拟环境。
以在2023_py3虚拟目录下创建day01项目为例, 大致步骤如下:
mkvirtualenv 2023_py3 # 创建虚拟环境
workon 2023_py3 # 切换到虚拟环境
pip install django # 在虚拟环境下安装django
django-admin startproject day01 #创建django项目
运行完上面命令后, 会在当前命令提示符所在的路径下创建一个day01的文件夹, 里面包含如下内容:
由于我们当前命令的提示符是在~(home)目录下的,所以day01其实是在home目录下的, 而不是在虚拟环境下的, 也就是说普通的shell命令还是运行在系统环境中的.
上面文件的说明如下:
在Django中,应用(App)是指一个可重用的独立模块,用于实现特定功能或提供特定服务。每个Django项目都由一个或多个应用组成,这些应用可以是您自己编写的应用,也可以是其他开发者编写的应用。
应用通常是一个具有特定功能的集合,例如用户认证、博客、论坛等。它们可以包含模型(Model)、视图(View)和模板(Template),以及其他一些文件和逻辑,用于处理相关的业务逻辑和数据操作。
使用应用的好处是可以实现模块化和重用性。您可以编写一次应用代码,并在多个项目中重复使用它。应用可以独立开发、测试和维护,使项目结构更加清晰和可扩展。
在Django中,您可以使用以下命令创建新的应用:
cd django项目的根路径
python manage.py startapp [应用的名称]
例如:
(2023_py3) chenyousheng@chenyoushengdeMac-mini ~ % cd day01
(2023_py3) chenyousheng@chenyoushengdeMac-mini day01 % ls
day01 manage.py
(2023_py3) chenyousheng@chenyoushengdeMac-mini day01 % python manage.py startapp booktest
Traceback (most recent call last):
File "/Users/chenyousheng/day01/manage.py", line 11, in main
from django.core.management import execute_from_command_line
ModuleNotFoundError: No module named 'django'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/Users/chenyousheng/day01/manage.py", line 22, in <module>
main()
File "/Users/chenyousheng/day01/manage.py", line 13, in main
raise ImportError(
ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment?
如果遇到上面的错误一般有2个原因:
python manage.py startapp booktest
不报错说明创建应用成功了, 然后通过tree命令可以查看应用的目录结构如下:
上面文件的说明如下:
例如用pycharm打开~/day01的项目, 你会发现此时idea使用的python解释器还是系统之前安装版本的解释器
此时我们需要修改为我们虚拟机环境下的解释器, 可以这样操作: Preferences>Project:day01>Python Interpreter> 点击右侧齿轮按钮选择Add
然后找到虚拟环境中的Python解释器
点击OK返回就可以看到切换成功了.
然后回到pycharm左侧界面可以看到python解释器已经变成了虚拟环境下的版本了.
然后随便打开一个python文件,会看到django包需要安装,直接安装即可
建立应用和项目之间的联系,需要对应用进行注册。修改settings.py中的INSTALLED_APPS配置项。
在当前项目根路径下执行
python manage.py runserver
出现上面界面说明启动成功了, 此时浏览器输入http://127.0.0.1:8000/可以看到下面的界面
但是你会发现上面的控制台中还出现了这个错误:
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
意思您有18个未应用的迁移。在应用程序迁移之前,您的项目可能无法正常工作:管理员、身份验证、内容类型、会话。运行"python manage.py migrate"来应用它们。
这个按照提示执行"python manage.py migrate"就可以了, 先在控制台按ctrl+c结束项目, 然后执行这条命令如下所示:
然后重新执行python manage.py runserver启动即可, 此时将不再看到有警告提示了:
python manage.py runserver命令默认在端口8000上启动开发服务器。如果您想要更改默认端口,可以在运行命令时指定不同的端口号。例如:python manage.py runserver 8080, 如下所示:
Django 的 ORM(对象关系映射)框架是 Django 提供的一个功能强大的工具,用于在 Python 代码和数据库之间进行交互。
ORM 框架的主要目标是在应用程序的数据模型和底层数据库之间建立映射关系,从而允许开发人员使用面向对象的方式操作数据库,而不是直接编写 SQL 查询。
Django 的 ORM 框架提供了一个高级 API,它使您能够使用 Python 类和方法来创建、读取、更新和删除数据库记录,而无需编写繁琐的 SQL 查询语句。
ORM 框架的常见用法包括:
设计 Django 中的模型类主要涉及如何映射数据库表和定义模型的字段。
下面是一些设计 Django 模型类的常见步骤和注意事项:
如果我想在booktest应用的models.py中添加一个BookInfo类作为模型类, 可以这样定义:
from django.db import models
# Create your models here.
# 图书类
class BookInfo(models.Model):
"""图书模型类"""
# 图书的标题: btitle代表数据库表中的btitle字段,CharField说明是一个字符串,max_length指定字符串的最大长度
btitle = models.CharField(max_length=20)
# 图书的出版日期: bpub_date代表数据库中bpub_date字段,DateField说明是日期类型
bpub_date = models.DateField()
模型类中不需要指定id主键字段, 这个Django会帮我们自动生成.
有了模型类之后,我们还需要生成迁移文件, 在~/day01项目根路径下执行如下命令:
python manage.py makemigrations
成功后会看到生成的迁移文件所在的路径
对应项目的内容如下:
在~/day01项目根路径下执行如下命令:
python manage.py migrate
成功后会看到Applying ok的提示
Django 默认使用的数据库是 SQLite,它是一个轻量级、功能强大的嵌入式数据库。当您创建一个 Django 项目时,默认情况下会配置并使用 SQLite 数据库。
你可以在项目的settings.py文件中查看
from pathlib import Path
# 获取到项目的根路径,其中resolve方法可以转换为绝对路径
BASE_DIR = Path(__file__).resolve().parent.parent
# Database
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
他对应的db文件就在下面这个位置
如何在Mac控制台下查看这个db文件呢?
Mac下自带安装了sqlite3命令, 因此可以直接使用该命令打开sqlite文件, 例如:
在Linux平台可以安装sqliteman工具类查看
如果想在sqlite3中查看有哪些表可以输入.table命令查看
可以看到我们的BookInfo类对应的表的表名是booktest_bookinfo, 也就是 应用的名字_+模型的类名小写。
如果我们想要查看booktest_bookinfo表的建表结构, 可以使用.schema命令, 如:
在 Django shell 中执行数据库操作,您可以按照以下步骤进行操作:
python manage.py shell
首先进入django shell
以在booktest_bookinfo表中插入一条数据为例:
>>> from booktest.models import BookInfo # 导入模块类
>>> b = BookInfo() # 创建一个BookInfo实例
>>> b.btitle = '天龙八部' # 设置标题
>>> from datetime import date # 导入日期模块
>>> b.bpub_date = date(1990,1,1) # 设置出版日期
>>> b.save() 保存记录
执行完上面操作后, 我们可以查看sqlite中的变化 ,首先输入exit()退出django shell, 然后使用sqlite3命令进入到db文件.
可以看到记录插入成功了.
如果要在django shell中获取记录, 并修改值的话可以使用模型类的objects对象的get方法来获取, 例如:
>>> from booktest.models import BookInfo # 导入模块类
>>> b = BookInfo.objects.get(id=1) # 获取id=1的这条记录
>>> b.btitle = "西游记" # 修改书名
>>> b.save() # 重新保存
修改后,再次查看sqlite, 可以发现修改成功了.
如果要删除表中的记录, 可以使用delete方法
>>> from booktest.models import BookInfo # 导入模块类
>>> b = BookInfo.objects.get(id=1) # 获取id=1的这条记录
>>> b.delete() # 删除这条记录
在booktest/models.py中新增HeroInof模型类, 和图书类建立关系. 一本图书可以有多个英雄, 也就是一对多关系
# 一类
# 图书类
class BookInfo(models.Model):
"""图书模型类"""
# 图书的标题: btitle代表数据库表中的btitle字段,CharField说明是一个字符串,max_length指定字符串的最大长度
btitle = models.CharField(max_length=20)
# 图书的出版日期: bpub_date代表数据库中bpub_date字段,DateField说明是日期类型
bpub_date = models.DateField()
# 多类
# 英雄类
class HeroInfo(models.Model):
# 英雄名字
hname = models.CharField(max_length=20)
# 英雄性别 默认False, 代表是男
hgender = models.BooleanField(default=False)
# 英雄的备注
hcomment = models.CharField(max_length=128)
# 在多类中定义关系属性,建立图书类和英雄类的一对多关系, 当生成表的字段时, 字段名会变成: 关系属性名_id, 也就是外键
# on_delete用于指定级联删除的规则
hbook = models.ForeignKey('BookInfo', on_delete=models.DO_NOTHING)
注意:
在Django 2.0版本之前,ForeignKey字段的on_delete参数是可选的,但默认行为是CASCADE。这意味着如果不显式指定on_delete参数,在旧版本中会默认使用级联删除。
然而,从Django 2.0版本开始,on_delete参数变为必需参数,你必须显式指定它。这样可以提醒开发者明确选择删除行为,同时也避免了意外的数据损失。
Django还提供了其他几个on_delete选项,以满足不同的需求。以下是一些常用的选项:
- models.CASCADE: 表示在被引用的对象被删除时,与之相关联的对象也将被级联删除。
- models.PROTECT: 如果有其他对象引用了被删除的对象,那么阻止删除操作并引发ProtectedError异常。
- models.SET_NULL: 将外键字段设置为NULL(如果允许为NULL)。
- models.SET_DEFAULT: 将外键字段设置为其默认值。
- models.SET(value): 将外键字段设置为指定的值。
- models.SET(…):可以使用一个函数或可调用对象来确定外键字段的值。
- models.SET():设置外键字段为目标的主键值。
- models.DO_NOTHING: 不做任何操作,仅仅删除被引用对象。
这个步骤使用的命令和之前是一样的
python manage.py makemigrations
python manage.py migrate
如下图所示:
注意: 执行命令生成的迁移文件是不能够删除的, 因为后面的迁移文件可能会依赖前面的迁移文件.
操作完成后, 查看生成的表结构:
仍然使用django shell进行操作
>>> from booktest.models import BookInfo,HeroInfo # 导入书籍和英雄模型类
>>> b = BookInfo() # 创建书籍类
>>> b.btitle = '天龙八部'
>>> from datetime import date
>>> b.bpub_date = date(1990,10,11)
>>> b.save()
>>> h = HeroInfo() # 创建英雄类
>>> h.name = '郭靖'
>>> h.hgender = False
>>> h.hcomment = '降龙十八掌'
>>> h.hbook = b # 关联英雄类的所在的书籍
>>> h.save()
如果要查询图书表或者英雄表的所有内容, 可以这样操作:
BookInfo.objects.all()
HeroInfo.objects.all()
如下图所示:
如果要通过图书查找关联的英雄,可以使用
图书对象.多方类名小写_set.all()
如下图所示:
关系型数据库的关系包括三种类型:
#定义图书模型类BookInfo
class BookInfo(models.Model):
btitle = models.CharField(max_length=20)#图书名称
bpub_date = models.DateField()#发布日期
bread = models.IntegerField(default=0)#阅读量
bcomment = models.IntegerField(default=0)#评论量
isDelete = models.BooleanField(default=False)#逻辑删除
#定义英雄模型类HeroInfo
class HeroInfo(models.Model):
hname = models.CharField(max_length=20)#英雄姓名
hgender = models.BooleanField(default=True)#英雄性别
isDelete = models.BooleanField(default=False)#逻辑删除
hcomment = models.CharField(max_length=200)#英雄描述信息
hbook = models.ForeignKey('BookInfo',on_delete=models.DO_NOTHING)#英雄与图书表的关系为一对多,所以属性定义在英雄模型类中
(2) 多对多关系
我们下面设计一个新闻类和新闻类型类,一个新闻类型下可以用很多条新闻,一条新闻也可能归属于多种新闻类型。
重新在项目day01下新建一个应用newstest
python manage.py startapp newstest
然后在day01/settings.py文件中注册应用
INSTALLED_APPS = [
...
'booktest',
'newstest'
]
编辑newstest/models.py文件设计模型类。
class TypeInfo(models.Model):
tname = models.CharField(max_length=20) #新闻类别
class NewsInfo(models.Model):
ntitle = models.CharField(max_length=60) #新闻标题
ncontent = models.TextField() #新闻内容
npub_date = models.DateTimeField(auto_now_add=True) #新闻发布时间
ntype = models.ManyToManyField('TypeInfo') #通过ManyToManyField建立TypeInfo类和NewsInfo类之间多对多的关系
Django 提供了一个内置的后台管理界面,可以帮助您轻松管理您的应用程序数据。
要使用Django 的后台管理首先需要确保Django 项目的 settings.py 文件中 ‘django.contrib.admin’ 被包含在内INSTALLED_APPS内,并且没有被注释掉。
INSTALLED_APPS = [
...
'django.contrib.admin',
...
]
在 settings.py 文件中添加 LANGUAGES 设置。这将设置 Django 可用的语言选项,以便用户可以选择他们偏好的语言。示例配置如下:
LANGUAGES = [
('en', 'English'),
('zh-hans', '简体中文'),
]
在 settings.py 文件中设置 LANGUAGE_CODE 为您想要使用的默认语言, 如中文简体(‘zh-hans’)
LANGUAGE_CODE = 'zh-hans'
在 settings.py 文件中,添加 django.middleware.locale.LocaleMiddleware 至 MIDDLEWARE 部分,确保它是在 ‘django.contrib.sessions.middleware.SessionMiddleware’ 和 ‘django.middleware.common.CommonMiddleware’ 之间。
MIDDLEWARE = [
...
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
在 settings.py 文件中,确保 LOCALE_PATHS 设定指向您的本地化文件所在的目录。
import os
LOCALE_PATHS = [
os.path.join(BASE_DIR, 'locale'),
]
在项目根目录中创建 locale 文件夹,并在其中创建相应的语言文件夹,例如 zh_Hans 文件夹。
运行以下命令,生成翻译文件:
python manage.py makemessages -l zh_Hans
执行成功后, local/zh_Hans文件夹内会多一些内容
打开生成的 django.po 文件,在其中添加您希望本地化的文本翻译。例如,将英文文本翻译为中文。
在 .po 文件中,每个需要翻译的字符串都有一个类似于以下的结构:
#: :
#.
msgid ""
msgstr ""
msgid 是原始文本的部分,msgstr 是要填写翻译后的文本的部分。
在 msgstr 部分中,添加您希望的翻译文本。例如,如果您希望将英文文本 “Hello, world!” 翻译为中文,可以进行如下修改:
#: :
#.
msgid "Hello, world!"
msgstr "你好,世界!"
继续在 .po 文件中添加其他需要翻译的文本,每个翻译后的文本都应在相应的 msgstr 部分进行编辑。
最后, 运行以下命令将 .po 文件编译成 .mo 文件:
python manage.py compilemessages
成功后会出现下面的.mo文件
要将时区设置为上海(Asia/Shanghai),只需在Django的配置文件settings.py中将TIME_ZONE参数设置为’Asia/Shanghai’,如下所示:
TIME_ZONE = 'Asia/Shanghai'
以上所有的设置完成后, 需要重启服务器才能生效.
要创建Django后台管理账号,可以使用Django提供的命令行工具createsuperuser
在终端或命令提示符中,进入您的Django项目的根目录。运行以下命令以创建超级用户:
python manage.py createsuperuser
然后根据提示输出管理员账号、邮箱、密码等, 如下图所示:
首先先启动发服务
python manage.py runserver
然后在浏览器中输入下面地址访问
http://127.0.0.1:8000/admin
看到下面登录界面后, 输入刚刚创建的管理员账号密码进行登录
成功后会看到这个界面
要在后台管理中管理数据库表需要将对应的应用的模块进行注册,可以通过在对应应用下的 admin.py 文件中导入您的模型类,并将其注册到 admin.site.register() 函数中来实现。例如:
from django.contrib import admin
from booktest.models import BookInfo, HeroInfo
# Register your models here.
admin.site.register(BookInfo)
admin.site.register(HeroInfo)
此时, 再次刷新后台管理页面, 就可以看到出现了booktest应用下的2个表了
点击BookInfos后可以进入到图书表的管理,可以看到下图中已经有一条记录在表中
但是显示的内容很难知道是什么, django是如何控制这里展示的内容的?
其实是通过模型类的__str__方法返回的内容展示的. 因此我们可以通过重写该方法来实现返回的内容, 例如图书表,我们可以让他返回图书的标题, 修改BookInfo模型类:
class BookInfo(models.Model):
"""图书模