文章目录
建立项目
指定规范
建立虚拟环境
安装 virtualenv(优先)
建立虚拟环境
激活虚拟环境
安装 Django
在 Django 中创建项目
创建数据库
查看项目
创建应用程序
定义模型
激活模型
Django 管理网站
定义模型 Entry
迁移模型 Entry
向管理网站注册 Entry
Django shell
创建网页:学习笔记主页
映射 URL
编写视图
编写模版
创建其他网页
模版继承
显示所有主题的页面
显示特定主题的页面
小结
建立项目
建立项目时,首先需要以规范的方式对项目进行描述,再建立虚拟环境,以便在其中创建项目。
指定规范
完整的规范详细说明了项目的目标,阐述了项目的功能,并讨论了项目的外观和用户界面。与任何良好的项目规划都和商业计划书一样,规范应突出重点,帮助避免项目偏离轨道。这里简单制定以下项目规范:
这里根据《Python编程从入门到实践》一书中的描述。
我们要编写一个名为“学习笔记”的 web 应用程序,让用户能够记录感兴趣的主题,并在学习每个主题的过程中添加日志条目。“学习笔记”的主页对这个网站进行描述,并邀请用户注册或登陆。用户登陆后,就可以创建新主题、添加新条目以及阅读既有的条目。学习新的主题时,记录学到的知识可帮助跟踪和复习这些知识。优秀的应用程序让这个记录过程简单易行。
建立虚拟环境
安装 virtualenv(优先)
如果系统中使用 Python 没有 venv 模块,那么就需要先安装 virtualenv 包,使用以下命令或者使用安装包安装:
pip3 install --user virtualenv
建立虚拟环境
要使用 Django ,首先需要建立一个虚拟工作环境。虚拟环境是系统的一个位置,可以在其中安装包,并将其与其他 Python 包隔离开。将项目的库与其他项目分离是有好处的,并且能够很方便地部署到服务器上。
为项目新建一个目录,将其命名为 learning_log ,然后进入这个目录下,并创建一个虚拟环境。使用以下命令来创建虚拟环境:
python3 -m venv 11_env #Linux下 py.exe -m venv 11_env #Windows下
激活虚拟环境
建立虚拟环境后,需要使用下面的命令来激活它:
source 11_env/bin/activate # Linux下 11_env\Scripts\activate # Windows下
安装 Django
在虚拟环境下安装 Django:
pip install Django
也可以下载 Django-3.1.3-py3-none-any.whl 文件安装,下载链接
使用下面命令来安装。
py -m pip install --user .\Django-3.1.3-py3-none-any.whl
验证安装成功:
在 Django 中创建项目
在还处于活动的虚拟环境的情况下,执行以下命令来新建一个项目:
django-admin.py startproject learning_log .
这里使用 Django 新建一个名为 learning_log 的项目。命令末尾的句点使得新项目使用合适的目录结构,这样开发完成后可以轻松地将应用程序部署到服务器上。
查看项目结构:
这里简单说明一下项目中的各个文件:
- settings.py 重要文件,指定 Django 如何与你的系统交互以及如何管理项目
- urls.py 重要文件,告诉 Django 应该创建那些网页来响应浏览器请求
- wsgi.py 重要文件,帮助 Django 提供它创建的文件(web server gateway interface)
创建数据库
Django 将大部分与项目相关的信息都存储到数据库中,所以我们还需要创建一个供 Django 使用的数据库。为项目 “学习笔记” 创建数据库,继续在虚拟环境下执行下面命令:
py manage.py migrate
将修改数据库成为迁移数据库。首次执行命令 migrate 时,将让 Django 确保数据库与项目的当前状态匹配。在使用 SQLite 的新项目中首次执行这个命令时,Django 将新建一个数据库。这里给出了需要在数据库表中创建的必要的信息:admin 、auth 、contenttypes 、sessions。此时就可以看到在 manage.py 所在目录下就新建了一个文件——db.sqlite3。
查看项目
下面就来核实 Django 是否正确创建了项目,执行 runserver 命令,如下显示:
在浏览器中输入这里的 server url:http://127.0.0.1:8000/,显示如下界面:
创建应用程序
Django 项目由一系列应用程序组成,它们协同工作,让项目成为一个整体。这里暂时创建一个应用程序,使它完成项目的大部分工作。
当前,在前面打开的终端窗口中应该还运行着 runserver。这里再打开一个终端窗口,执行如下命令:
source 11_env/bin/activeate py manage.py startapp learning_logs
命令 startapp 使得 Django 就建立创建应用程序所需的基础设施。如果现在查看项目目录的话,会发现其中新增了 learning_logs 文件夹。打开这个文件夹,能够看到 Django 创建了 models.py admin.py views.py 等文件。我们使用 models.py 来定义我们要在应用程序中管理的数据,admin.py 和 views.py 后面会提到。
定义模型
现在根据 “学习笔记” 项目来思考一下需要涉及的数据。
每位用户都需要创建很多主题,而很多条目斗鱼主题相关联,这些条目又都是以文本方式显示。此外,我们还需要存储每个条目的时间戳,以方便告诉用户这些条目都是什么时候创建的。
打开 models.py 文件,它当前包含以下内容:
from django.db import models # Create your models here.
这里已经提前为我们导入了模块 models ,我们需要自己创建自己的模型,告诉 Django 如何处理应用程序中存储的数据。在代码层面,模型就是一个类,就像前面讨论的每个类一样,包含属性和方法。下面是表示用户要存储的主题的模型:
from django.db import models # Create your models here. class Topic(models.Model): '''用户学习的主题''' text = models.CharField(max_length=200) date_added = models.DateTimeField(auto_now_add=True) def __str__(self): '''返回模型的字符串表示''' return self.text
- 属性 text 是一个 CharField ,用来存储少量的文本,这里将最大长度设置成 200.
- 属性 date_added 是一个 DateTimeField ,用来记录日期和时间的数据,传递实参 auto_now_add=True 可以使得这个属性自动设置成当前日期和当前时间。
我们需要告诉 Django ,默认应该使用哪个属性来显示有关主题的信息,Django 会调用方法 __str__() 来显示模型的简单表示。这里返回存储在属性 text 中的字符串。
激活模型
要使用模型,必须让 Django 将应用程序包含到项目中。为此,打开 settings.py ,下面的片段就是告诉 Django 哪些应用程序要安装到项目中:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
这是一个元组,告诉 Django 项目是由哪些应用程序组成的。可以将其中的 INSTALLED_APPS 修改成下面这样:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 自定义应用 'learning_logs', ]
通过将应用程序编组,在项目不断增大,包含更多的应用程序时,有助于对应用程序进行跟踪。这里新建了一哥片段,当前仅仅包含 learning_logs 应用程序。
$ python manage.py makemigrations learning_logs
命令 makemigrations 使得 Django 确定该如何修改数据库,使得其能够存储与我们定义的新模型相关联的数据。输出表明 Django 创建了一个名为 0001_initial.py 的迁移文件,这个文件将在数据库中为模型 Topic 创建一个表。
下面来应用这种迁移,让 Django 帮我修改数据库:
$ py.exe manage.py migrate
这个命令的大部分输出都与我们首次执行命令 migrate 的输出相同,这里, Django 确认一切正常。
每当需要修改项目管理的数据时,都要采用以下三个步骤:
- 修改 models.py
- 对 learning_logs 调用 makemigrations
- 让 Django 迁移项目
Django 管理网站
为应用程序低昂有模型时, Django 提供的管理网站(admin site) 使得可以轻松处理模型。网站的管理员能够使用管理网站,而普通用户不能使用。这里,我们将建立管理网站,并通过使用模型 Topic 来添加一些主题。
- 创建超级用户
- Django 允许你创建具备所有权限的用户——超级用户。权限决定了用户可执行的操作。最严格的权限设置只允许用户浏览阅读网站的公开信息;注册了的用户通常可以阅读自己的私有数据,还可以查看一些只有会员才能查看的信息。为有效地管理 Web 应用程序,网站所有者通常需要访问网站存储的所有信息。优秀的管理员会小心对待用户的敏感信息,因为用户对其访问的应用程序有极大的信任。
在 Django 中创建超级用户,需要执行下面命令:
$ python manage.py createsuperuser
当执行命令 createsuperuser 时,Django 提示你输入超级用户的用户名,这里输入 11_admin ,后面会紧接着输入电子邮件地址(也可以为空),然后就是设置用户密码。
- 向管理网站注册模型
Django 自动载管理网站中添加了一些模型,例如:User 和 Group ,但是对于我们需要创建的模型,必须手工进行注册。
我们创建的应用程序 learning_logs 时,Django 在 models.py 所在的目录中创建了一个名为 admin.py 的文件,在这个文件中添加如下内容:
from django.contrib import admin from learning_logs.models import Topic # Register your models here. admin.site.register(Topic)
这些代码导入我们需要注册的模型 Topic ,再使用 admin.site.register(Topic) 使得 Django 通过管理网站能够管理我们的模型。
现在,使用超级用户账户访问管理网站,使用超级用户的用户名和密码登录。记得使用 py.exe manage.py runserver 使得服务运行起来。如下:
3. 添加主题
向管理网站注册 Topic 后,我们来添加第一个主题。为此,单击 Topic 进入主题网页,它几乎是空的,这是因为这里我们没有添加任何的主题。单击 Add ,将看到一个用于添加新主题的表单,表单的第一个方框输入 Chess ,单击 Save ,将反悔到主题管理页面,其中就会显示刚刚创建添加的主题:
紧接着,继续创建一个主题 Rock Climbing ,这样就添加完成两个新主题了。如下:
定义模型 Entry
要记录学到的国际象棋和攀岩知识,需要为用户在学习笔记中添加的条目定义模型。每个条目都与特定主题相关联,这种关系被成为多对一关系,即多个条目可关联到同一主题。下面修改 models.py 代码:
from django.db import models # Create your models here. class Topic(models.Model): '''用户学习的主题''' text = models.CharField(max_length=200) date_added = models.DateTimeField(auto_now_add=True) def __str__(self): '''返回模型的字符串表示''' return self.text class Entry(models.Model): '''学到的有关主题的具体知识''' topic = models.ForeignKey(Topic, on_delete=models.CASCADE) text = models.TextField() date_added = models.DateTimeField(auto_now_add=True) class Meta: verbose_name_plural = 'entries' def __str__(self): '''返回模型的字符串表示''' return self.text[:50] + "..."
像 Topic 一样,Entry 也继承了 Django 基类 Model 。第一个属性 topic 是一个 ForeignKey 实例。外键是一个数据库术语,引用了数据库中的另一条记录;这些代码将每个条目关联到特定的主题。每个主题创建时,都给它分配一个键(ID)。需要在两项数据之间建立关联的时候,Django 使用与每项信息相关联的键。
接下来是属性 text ,它是一个 TextField 实例。这种字段不需要长度限制。属性 data_added 使得能够按照创建顺序显示条目,并在每个条目旁边放置时间戳。
后面,在 Entry 类中嵌套了 Meta 类。Meta 类存储用于管理模型的额外信息,这里,我们可以设置一个特殊属性,使得 Django 在需要的时候能够使用 Entries 来表示多个条目。如果没用这个类,Django 将使用 Entrys 来表示多个条目。最后,方法 __str__() 是告诉 Django ,呈现条目时显示的信息。由于条目包含的信息很长,这里仅仅显示前50个字符。
迁移模型 Entry
由于新添加了一个模型,所以需要再次迁移数据库,修改 models.py 代码后,执行 py.exe manage.py makemigrations 'app_name' ,如下:
<...\Scripts> py.exe manage.py makemigrations learning_logs Migrations for 'learning_logs': learning_logs\migrations\0002_entry.py - Create model Entry <...\Scripts> py.exe manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, learning_logs, sessions Running migrations: Applying learning_logs.0002_entry... OKe
生成了新的迁移文件——0002_entry.py ,它告诉 Django 如何修改数据库,使其能够存储与模型 Entry 相关的信息。执行命令 migrate ,能够发现迁移一切顺利。
向管理网站注册 Entry
接下来还需要注册模型 Entry ,为此,需要将 admin.py 添加模型应用:
from django.contrib import admin from learning_logs.models import Topic, Entry # Register your models here. admin.site.register(Topic) admin.site.register(Entry)
回到 Django 的管理页面,能看到此时已经出现的新添加的模型: