每一个python项目都创建一个新的虚拟环境有助于我们对于项目与其所对应包的管理等。
这里使用pycharm工具进行操作演示。
pycharm左上方找到菜单——File——New Project。
点击后弹出新建项目窗口进行配置
点击create,然后弹出一个新窗口,选择This Window或New Window都可以。
然后我们便完成了即将用于django虚拟环境的初步创建。
打开pycharm终端,输入安装命令 pip install django,并回车。出现下列页面便说明安装完成。
此时我们已经安装好了django模块,接下来就该新建项目了。依旧是在终端中完成,输入django-admin.exe startproject mysite(项目名称)并回车,然后可以在项目路径下看到我们的主项目mysite,里面还有一个mysite包,这是我们的主应用。还有一个manage.py文件,这是我们除了创建django项目外需要使用的可执行文件。具体结构如下图所示。
这些文件和目录是一个标准的Django项目的基本组成部分,可以根据项目的需要添加其他文件和目录。它们共同构建了我们的Web应用程序,提供了项目的配置、路由、模板、静态文件等功能。通过编辑这些文件,可以定制和扩展我们的Django应用程序。
作为Django项目的主要设置文件。我们可以在这里配置数据库连接、应用程序设置、模板设置、国际化等。这是项目的核心配置文件。接下来会讲解一些比较基础的配置与讲解。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 下方将来会添加自己的应用或第三方模块应用
]
LANGUAGE_CODE:语言配置。
# LANGUAGE_CODE = 'en-us' 默认语言为英文,改为中文:
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE:时区配置。
# TIME_ZONE = 'UTC' 默认时区为UTC,
改为中国上海:TIME_ZONE = 'Asia/shanghai'
DATABASES:数据库配置。Django默认自带使用sqlite3数据库。可以将数据库修改为mysql或其他django支持的数据库类型。
# 默认的sqlite3数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# 配置为MySQL数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '数据库名字',
'USER': '用户名',
'PASSWORD': '密码',
'HOST': 主机地址;
'PORT': '3306',
}
}
ROOT_URLCONF:根路由。指向的也就是我们的项目总路由
ROOT_URLCONF = 'mysite.urls'
DEBUG:调试设置。当 DEBUG 设置为 True 时,Django 处于调试模式。在调试模式下,如果发生错误,Django 会向用户显示详细的错误页面,包括错误消息和代码跟踪,这有助于开发人员识别和解决问题。调试模式还启用了一些开发工具和功能,如自动重新加载代码、数据库查询日志记录等,有助于开发过程中的快速迭代和故障排除。但是,在生产环境中,DEBUG 应设置为 False,以提高安全性。在生产环境中,不应向终端用户显示敏感信息,因此详细的错误页面和调试信息应该被禁用。
DEBUG = True
ALLOWED_HOST:是一个列表,其中包含允许访问你的Django应用程序的主机名或IP地址。这是一项重要的安全设置,用于防止跨站请求伪造(CSRF)和其他潜在的安全漏洞。当DEBUG调试模式为False时,一般将ALLOWED_HOST设置为 ”*“ ,也就是所有地址都可以访问。
ALLOWED_HOSTS = []
# 当DEBUG=False时需要这样设置
ALLOWED_HOSTS = ["*"]
TEMPLATES:模板文件设置。是 Django 项目中用于存储HTML模板文件的目录。'APP_DIRS': True,意思为当前模板文件的搜索位置会从应用下方进行查找,这里建议配置'DIRS':[],也就是指定其他查找路径,可以设置为BASE_DIR / 'templates'这样就可以在总路径下创建一个templates模板文件夹并使用。
# 未配置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
# 进行配置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# BASE_DIR为项目总路径,templates可以随便起名,但是建议约定俗成
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
STATIC_URL:用于指定静态文件的基本URL。静态文件包括CSS、JavaScript、图像和其他不需要动态生成的文件。通过设置STATIC_URL,可以告诉Django如何访问和提供这些静态文件。默认也是从应用下进行查找。
# 一般不进行修改,但是会配置新的STATICFILES_DIRS
STATIC_URL = 'static/'
STATICFILES_DIR:相当于TEMPLATES模板文件中的'DIRS',通过配置可以使django从项目总路径下进行查找。
# 建议在STATIC_URL附近添加
STATICFILES_DIRS = [BASE_DIR / 'static']
MEDIA_URL:用于指定媒体文件的基本URL。媒体文件通常包括用户上传的图像、音频、视频等文件。通过设置MEDIA_URL,可以告诉Django如何访问和提供这些媒体文件。
# 与STATIC_URL设置基本一样
MEDIA_URL = 'media/'
注意:某些配置在settings中可能没有,可以进入下载的django包中找到django的配置进行查看。路径:venv——Lib——site-packages——django——conf——global_settings.py
注意接下来的命令都要使用manage.py,所有要先cd到自己的项目目录下才能进行。在django中,在设计了模型类后,需要先生成迁移文件,然后再迁移到数据库这两步,而django也自带了几个应用,在创建完项目后,可以先同步迁移一下数据库。
生成迁移文件命令:python manage.py makemigrations
迁移到数据库命令:python manage.py migrate
django已经生成了迁移文件,所有此时只需在终端中输入python manage.py migrate便可以完成迁移。
此时完成迁移后会发现在项目路径下多出一个 db.sqlite3数据库文件,这也就是django默认自带属于的数据库,此时可以使用数据库可视化工具进行连接,可以发现里面已经存在了django应用自带的一些表。
而在django-migrations中显示了django自带的迁移记录
此时完成迁移后,就可以进行Django服务的启动。依旧是在终端输入,启动命令:python manage.py runserver(不指定端口,django会默认启用8000端口)
再点击http://127.0.0.1:8000/
跳转到此页面便是已经安装成功。
我们进入总应用下的urls.py后会发现,在urlpatterns(Django 项目中的一个变量,它定义了项目的 URL 路由映射规则。具体来说,这是一个列表,其中包含了一系列 URL 路由模式(patterns)以及与这些模式关联的视图函数或类。)中已经存在了一个admin路由(一组内置的 URL 路由,用于提供管理员界面(后台管理)功能。这些路由允许管理员用户对应用程序中的数据进行管理,包括创建、读取、更新和删除(CRUD)操作,而无需编写额外的代码。),此时我们便可以启动项目后在路径后拼接上admin便可以进入。
但是此时需要账号密码才能进入,这是我们就需要创建一个用户进行登录后台,在终端中输入命令:python manage.py createsuperuser进行创建超级管理员用户。注册完成后便可以登录进入后台。
此时使用账号密码登录后台。
此时便进入了django的后台管理 。Django 的 admin 后台是一个内置的管理界面,用于管理和维护 Django 应用程序的数据。我们在创建了自己的应用,然后编写完我们数据模型后也可以通过admin.py将自己的数据模型注册到后台并进行操作与管理。admin后台主要功能包括:
总之,Django 的 admin 后台是一个强大的工具,用于简化管理应用程序的数据和用户。它使开发人员能够快速查看和操作数据库记录,同时提供了可自定义性以适应不同项目的需求。这使得开发、测试和维护 Django 应用程序变得更加便捷和高效。
其实在数据库中,我们也可以找到数据库与后台之间的对应关系,比如我们在创建了一个用户后,就可以在auth_user表中找到我们创建的对应用户信息,也可以在后台进行修改等操作。
我们在上方一直在讲解创建项目时自带的主应用,接下来我们就要开始创建自己的应用了。
首先,还是在命令行输入命令:python manage.py startapp news(应用名),然后回车。然后便可以看到项目路径下多了一个名为news的应用。总结构如下:
在创建完自己应用的第一步,就是在总应用的settings中进行注册。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 下方将来会添加自己的应用或第三方模块应用
# 将刚才创建的应用进行注册
'news',
]
在总路由中加入自己的应用路由并在自己应用下创建一个路由文件:urls.py
from django.contrib import admin
# 导入include
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
# 加入自己应用的路由,两种方法都可以,第二个是命名空间写法
#,可以在后续使路由,视图函数与模板文件路径设置更加简便,这里先默认使用第一种
# 注意include的第一个参数约定俗成就是自己应用下的urls,然后在自己应用下进行新建urls.py文件
path('news/', include("news.urls")),
# path('news/', include("news.urls", namespace="news"))
]
在自己应用下的urls中写入自己的路由。这里第一个视图命名为index,切记视图名后必须有“/”,也可以不填写视图名”index/“,这样进入应用路由后会自动进入index视图函数。
from django.urls import path, include
# 默认在views中进行编写视图函数
from .views import *
urlpatterns = [
# 本应用下的路由,第一个参数是路由名,第二个参数是视图函数名,也可以有第三个参数,
# 也就是命名空间,name=index(一般三个都与视图函数名一致)
path("index/", index)
path("index/", index, name="index")
]
接下来就可以到 应用下的views中进行编写视图函数.这里面HttpResponse是一个用于测试的视图常用函,每一个视图函数都必须有一个形参名为request,在后面会有大用。
# 先导入HttpResponse进行测试
from django.shortcuts import render,HttpResponse
# Create your views here.
def index(request):
# 这里返回使用HttpResponse进行测试(只能输出一句话)
return HttpResponse("欢迎来到首页")
然后便可以启动服务,进入网站后发现已经不是启动成功,而是page not found,也就是404画面
可以看到这里由于我们设置了debug=True,所以会有下面都有哪些视图的提醒,在后面拼接news/再回车
这里可以看到news/后还有一个index/视图,也就是我们刚才在应用下加入的视图和刚才编写的index视图函数,再在后面拼接上index/,再次回车
此时便可以看到,我们刚才编写的index函数中的HttpResponse的返回结果。 当然使用HttpResponse这只是作为测试,后续在开发中用的多的还是render()函数
在我们自己创建的应用程序的 models.py 文件中,可以定义应用程序的数据模型,这些数据模型将映射到数据库表。数据模型定义了表的结构以及表中的字段。每个模型类通常都是一个 Python 类,它继承自 Django 的 models.Model 类,并定义了模型的字段和属性。接下来是一个简单的模型类的创建。
from django.db import models
# Create your models here.
# 创建我们新闻中的第一个类:新闻种类Category,继承models.Model
class Category(models.Model):
# 类属性,通常需要写入到类的初始化init方法中的,在这里因为继承了models.Model,可以直接进行编写
# 使用的CharField字段也就对应着数据库中的varchar等字段
# max_length最大长度必须要指明,verbose_name是在网站上的展示名,可选
name = models.CharField(max_length=20, verbose_name="新闻种类")
# __str__方法定义了模型的字符串表示,通常在在管理界面中显示模型的对象时使用。
def __str__(self):
return self.name
# 创建我们新闻中的第二个类:新闻News,同样继承models.Model
class News(models.Model):
# 新闻标题,同样使用CharField字段,这里由于不能重复,需要使用unique唯一约束
title = models.CharField(max_length=10, verbose_name="标题", unique=True)
# 新闻正文,这里使用长文本,未来在使用第三方富文本插件后可以进行更改
content = models.TextField(verbose_name="新闻正文")
# 时间,使用DateTimeField字段,auto_now_add=True可以自动添加新闻添加时的时间,不用手动添加
time = models.DateTimeField(auto_now_add=True, verbose_name="时间")
# 新闻种类,联系到Category表,所以使用ForeignKey外键,on_delete=models.CASCADE为级联删除
category = models.ForeignKey(to="Category", on_delete=models.CASCADE)
还有很多其他字段和参数,包括第三方可以使用的富文本插件等等,在后续会做详细解释。
每次在定义完模型类后,还需要同步到数据库,这时需要先生成迁移文件,命令同上,为:python manage.py makemigrations,输入完后按下回车,会发现提醒生成了两张表(一个模型类就对应了一张表)和一个迁移文件
我们再进入应用下的migrations包中,会发现多了一个0001_initial.py文件,这就是我们的第一个迁移文件。
3.3.3 迁移到数据库
我们刚才只是生成了迁移文件,还没有同步到数据库,这里需要再次迁移,才能将模型类同步到数据库中,生成对应的表。命令为:python manage.py migrate。在命令行输入后按下回车。然后会显示迁移完成。
再次打开数据库查看。 发现会多出刚才创建的两个新表。
需要注意,我们每次在models.py中增加新的模型类或者修改其中字段时都需要重新生成迁移文件并向数据库进行重新迁移,但是如果是修改类似于verbose_name或类的__str__字符串表示,是不需要重新生成迁移的。这里将会展示增加新的字段或新的模型类(新表)时遇到的问题。
增加新的模型类
在models.py中加入一个测试模型类:
# 用于测试的模型类
class Test(models.Model):
test = models.CharField(max_length=10)
然后需要重新生成迁移文件:python manage.py makemigrations。然后会发现在migrations中多出一个迁移文件。
再次迁移到数据库:python manage.py migrate。此时便同步到了数据库中。同步成功如下:
向已存在的表中增加新的字段
向刚才的test模型类中再次添加新的字段
# 用于测试的模型类
class Test(models.Model):
test = models.CharField(max_length=10)
# 测试字段
test2 = models.CharField(max_length=20)
再次生成迁移文件:python manage.py makemigrations。此时会发现,提示报错说缺少一个默认值。
这个错误消息是由于尝试向数据库表中添加一个非空字段而没有指定默认值,但是已经存在的行需要一个默认值以进行填充。Django 提供了两种选项来解决这个问题,可以根据需求选择其中一种:
1,提供一个一次性默认值(Provide a one-off default now): 如果希望添加的新字段有一个默认值,并且希望将这个默认值应用于已存在的数据库记录,可以选择这个选项。Django 将要求我们输入默认值,然后将此默认值应用于所有现有的记录。
2,手动在 models.py 中定义默认值(Quit and manually define a default value in models.py): 如果希望在模型的字段定义中明确指定默认值,而不是在迁移过程中提供一次性默认值,可以选择这个选项。这意味着需要返回到你的模型类(models.py)中,为新字段指定一个默认值,然后再次运行 makemigrations 命令生成迁移文件。
这里建议都选择第二个选项。
# 用于测试的模型类
class Test(models.Model):
test = models.CharField(max_length=10)
# 测试字段
test2 = models.CharField(max_length=20, default="默认")
当然这里再介绍两个好用但是不太推荐的方法,在项目应用创建的初期,可以使用,但是数据多了之后建议使用Git等版本控制软件
直接删除所有迁移文件和数据库
这是最简单粗暴的一种方法,先删除我们应用下migrations中的所有迁移文件和sqlite3数据库(如果使用的MySQL等在MySQL中进行操作):
在删除成功后,重新生成迁移文件: python manage.py makemigrations
然后重新进行迁移:python manage.py migrate
此时便相当于直接初始化重新生成了数据库与数据库中的表
删除迁移文件,迁移记录和表
这一种方法不会删除数据库,但是要更加麻烦一些
删除迁移文件,数据库中的迁移记录(在数据库中的django_migrations表中,需要注意这里由于刚才同步将django自带应用和我们的应用一起进行了迁移,所有这里需要小心不要删除django自带的迁移记录,需要找到自己的应用的迁移记录)和数据库中我们应用的数据表
python manage.py 回车:可以查看 manage.py 后续相关命令或参数
python manage.py help:这将列出 manage.py
支持的所有命令以及它们的描述。这个命令将帮助了解可用的 Django 管理命令以及如何使用它们。
python manage.py help
是你想要获取帮助的特定命令的名称。这将显示有关该命令的详细信息,包括用法、选项和参数。
总的来说,django-admin
是全局工具,而 manage.py
是特定于每个 Django 项目的工具。通常情况下,会在项目的根目录中使用 manage.py
来执行项目管理任务。如果需要执行与项目无关的全局任务(例如创建新项目),则可以使用 django-admin
。
在下一篇中会讲解进一步的路由,视图与后台操作等,涉及Django的命令也会在后续编写一个常用命令总结。
Getting started with Django | Djangohttps://www.djangoproject.com/start/
此处为4.2版本
https://docs.djangoproject.com/en/4.2/https://docs.djangoproject.com/en/4.2/