Django项目由一系列应用程序组成,它们协同工作让项目成为一个整体。
进入目录learn_log,并激活虚拟环境,再执行命令 python3 manage.py startapp learning_logs,创建应用程序
命令startapp appname让Django搭建并创建应用程序所需的基础设施。执行后ls查看目录可看到其中新增了learning_logs文件夹。文件夹中最重要的文件为models.py、admin.py和views.py。其中models.py用来定义要在应用程序中管理的数据,后续介绍admin.py和views.py。
一、定义模型
打开文件models.py
这里导入了模块models,并让我们创建自己的模型。模型告诉Django如何处理应用程序中存储的数据。在代码层面,模型就是一个类。
如下表示用户将存储的主题的模型:
from django.db import models class Topic(models.Model): """用户学习的主题""" text = models.CharField(max_length=200) date_added = models.DateTimeField(auto_now_add=True) def __str__(self): """返回模型的字符类型""" return self.text # Create your models here.
text属性是一个CharField---由字符组成的数据,即文本。需要存储少了文本,如名称、城市、标题时,可使用CharField。定义CharField属性时一定要告诉Django该在数据库中预留多少空间。
date_added是一个DateTimeField---记录日期和时间的数据。使用实参auto_now_add=True,每当用户创建新主题时,Django都会将这个属性自动设置为当前日期和时间。
二、激活模型
要使用这些模型,必须让Django将前述应用程序包含到项目中。为此,打开settings.py(位于目录learning_log/learning_log中),其中以下部分告诉Django哪些应用程序被安装到了项目并将协同工作:
将前面创建的应用程序learning_logs添加到这个列表
通过将应用程序分组,在项目不断增大,包含更多应用程序是,有助于对应用程序进行跟踪。
接下来需要修改数据库,使其能够存储与模型Topic相关的信息,为此,在终端窗口中执行命令:python3 manage.py makemigrations learning_logs
makemigrations让Django确定如何修改数据库,使其能够存储与前面定义的新模型相关联的数据。输出表明Django创建了一个名为0001_initial.py的迁移文件,这个文件将在数据库中未模型Topic创建一个表。
现在应用这种迁移,让Django修改数据库,执行命令:python3 manage.py migrate
(每当需要修改管理的数据时,都需要采取这三个步骤,先修改models.py,然后对learning_logs调用makemigrations,然后让Django迁移项目)
即修改后需要python3 manage.py makemigrations APP_NAME然后python3 manage.py migrate
三、Django管理网站
1、为网站创建超级用户
执行命令python3 manage.py createsuperuser,输入用户名密码
2、向管理网站注册模型
Django自动在管理网站中添加了一些模型,如User和Group,对于我们创建的模型,需要手工进行注册。
我们创建应用程序learning_logs时,Django在models.py所在目录中创建了一个名为admin.py文件,进行如下修改:
models前面的句点是为了让Django在admin.py所在目录查找models.py。admin.site.register(Topic)让Django通过管理网站管理模型.
访问localhost:8000/admin并输入刚刚创建的超级用户名和密码,就可以看到管理界面
可以添加一个Chess主题
四、定义模型Entry
要记录学到的Chess知识,用户必须能够在学习笔记中添加条目。为此需要定义相关的模型,添加模型entry来显示主题下的条目:models.py下新增
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 f"{self.text[:50]}..."
五、迁移模型Entry
添加新模型后需要再次迁移数据库
依次执行命令:python3 manage.py makemigrations learning_logs、python3 manage.py migrate
六、向管理网站注册Entry
admin.py修改:
from django.contrib import admin from .models import Topic, Entry admin.site.register(Topic) admin.site.register(Entry) # Register your models here.
返回http://127.0.0.1:8000/admin/,将可添加知识,添加知识时选择对应主题