Python使用Django开发web应用程序(二)创建应用程序

Django由一系列应用程序组成,让项目成为一个整体!!!

1、创建应用程序

在上一节打开的终端窗口中还运行着runserver,这边我们再打开一个新的终端窗口,并切换到manage.py所在的目录,激活虚拟环境,再执行命令startapp

ll_env\Scripts\activate

python manage.py startapp learning_lops

dir

dir learning_lops

python manage.py startapp learning_lops
让Django建立创建应用程序所需的基础设施,可以看见新增了一个文件夹learning_lops(见图一所示:)
dir learning_lops
查看文件夹中所含有的文件, models.py来定义我们要在应用程序中管理的数据。(见图二所示:)

图一所示:
Python使用Django开发web应用程序(二)创建应用程序_第1张图片
图二所示:
Python使用Django开发web应用程序(二)创建应用程序_第2张图片

2、定义模型

我们想想涉及到的数据,每位同学都需要在学习笔记中创建很多主题。用户输入的每个条目都与特定的主题相关,这些条目将以文本的形式显示。我们还需要存储每个条目的时间戳,以便能够告诉用户创建的时间。

打开models.py文件,看看包含了哪些类容:

为我们导入了models模块,还让我们创建自己的模型,如下图所示
Python使用Django开发web应用程序(二)创建应用程序_第3张图片

在代码层面,模型就是一个类,包含属性和方法。

下面是表示用户将要存储的主题的模型:

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

Topic
创建了一个Topic类,只包含两个属性text和date_added
text=models.CharField(max_length=200)
CharField由字符或文本组成的数据,需要存储少量的文本,如名称、标题或城市时,可使用CharField,定义CharField属性时,必须告诉Django预留多少空间,max_length=200,这边我们预留了最大空间为200字符。
date_added=models.DateTimeField(auto_now_add=True)
DateTimeField记录日期和时间的数据,传递了实参auto_now_add,每当用户创建主题时,这都让Django将这个属性自动设置成当前的日期和时间。

3、激活模型

要使用模型,必须让Django将应用程序包含到项目中。

打开settings.py文件,显示如下:
Python使用Django开发web应用程序(二)创建应用程序_第4张图片
这是一个元组,告诉Django项目是由哪些应用程序组成。
在INSTALLED_APPS文件中修改:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    
    #我的应用程序
    'learning_lops',
]

接下来,需要让Django修改数据库,使其能够存储与模型Topic相关的信息。
在终端执行下面的命令:

python manage.py makemigrations learning_lops

makemigrations
命令makemigrations 让Django确定该如何修改数据库,使其能够存储与我们定义的新模型相关联的数据。
输出表明Django创建了一个名为0001_initial.py的迁移文件,这个文件将在数据库中为模型Topic创建一个表。

效果如图所示:
Python使用Django开发web应用程序(二)创建应用程序_第5张图片
应用这种迁移,让Django替我们修改数据库:

python manage.py migrate

效果如图所示:
Python使用Django开发web应用程序(二)创建应用程序_第6张图片

总结

每当需要修改“学习笔记”管理数据时,都采取如下三个步骤:

  1. 修改models.py
  2. 对learning_lops调用makemigrations
  3. 让Django迁移项目

4、Django管理网站

为应用程序定义模型时,Django提供的管理网站(admin site)让你能够轻松的处理模型。网站的管理员可使用管理网站,但普通用户不能使用。本节将建立管理网站,并通过它使用模型Topic来添加一些主题。

4.1 创建超级用户

python manage.py createsuperuser

你执行命令createsuperuser时,Django会提醒你输入超级用户(用户名、邮箱(邮箱可以为空)、密码)
这边我输入的:
用户名为 ll_admin
密码为 admin123
Python使用Django开发web应用程序(二)创建应用程序_第7张图片

4.2 向管理网站注册模型

Django自动在管理网站中添加了一些模型,如User和Group,但对于我们创建的模型,必须手工进行注册。

Django在models.py所在的目录中创建了一个名为admin.py的文件。
在admin.py中修改:

from django.contrib import admin

from learning_lops.models import Topic

admin.site.register(Topic)

from learning_lops.models import Topic
导入我们要注册的模型Topic
admin.site.register(Topic)
在使用admin.site.register( )让Django通过管理网站管理我们的模型

现在我们使用超级用户账户访问管理网站:
http://127.0.0.1:8000/admin/

效果图如下所示:
输入我们的超级用户账户及密码
Python使用Django开发web应用程序(二)创建应用程序_第8张图片
登录后效果图如下所示:
Python使用Django开发web应用程序(二)创建应用程序_第9张图片

要确保终端窗口中运行着Django服务器

4.3 添加主题

1、向管理网站注册Topic后,我们来添加主题,点击add
Python使用Django开发web应用程序(二)创建应用程序_第10张图片
2、输入Chess,并点击save,主题创建成功
Python使用Django开发web应用程序(二)创建应用程序_第11张图片
3、在创建一个主题,这时候我们可以看见,创建了两个主题Chess和Rock Climbing
Python使用Django开发web应用程序(二)创建应用程序_第12张图片

5、定义模型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 self.text[:50]+"..."

class Entry(models.Model):
像Topic一样,Entry也继承了Django基类Model
topic=models.ForeignKey(Topic,on_delete=models.CASCADE)
topic是一个ForeignKey实例
text=models.TextField()
text是一个TextField实例,这种字段不需要长度限制
date_added = models.DateTimeField(auto_now_add=True)
属性date_added 让我们能够按照创建顺序呈现条目,并在每个条目旁边放置时间戳
class Meta:
在Entry中嵌套了Meta类,Meta存储用于管理模型的额外信息
== return self.text[:50]+"…"==
由于条目包含的文本可能很长,我们让Django只显示text的前50个字符

5.2、迁移模型Entry

由于我们添加了一个新模型,因此我们再次迁移数据库
三步骤:
1、修改models.py
2、执行命令python manage.py makemigrations learning_lops
3、再执行命令python manage.py migrate

python manage.py makemigrations learning_lops

python manage.py migrate

生成了一个新的迁移文件-----0002_entry.py,它告诉Django如何修改数据库。执行命令migrate,迁移成功

效果如图所示:
Python使用Django开发web应用程序(二)创建应用程序_第13张图片

5.3、向管理网站注册Entry

我们还需要注册模型Entry,修改admin.py文件

from django.contrib import admin

from learning_lops.models import Topic,Entry

admin.site.register(Topic)
admin.site.register(Entry)

返回到 http://127.0.0.1:8000/admin/
将看到learing_lops下列出现了Entry

效果图如下所示:
Python使用Django开发web应用程序(二)创建应用程序_第14张图片
点击add,进入你将发现多了个下拉列表,让你能够选择为哪个主题创建条目,还有一个用于输入条目的文本框。
Python使用Django开发web应用程序(二)创建应用程序_第15张图片
选择Chess,并添加一个条目
Python使用Django开发web应用程序(二)创建应用程序_第16张图片
返回到主条目管理页面,你会发现只显示了条目的开头部分,并不是全部文本,之前我们设置了 return self.text[:50]+"…"
Python使用Django开发web应用程序(二)创建应用程序_第17张图片
继续在创建两个条目,分别创建Chess和Rock Climbing条目
Python使用Django开发web应用程序(二)创建应用程序_第18张图片
Python使用Django开发web应用程序(二)创建应用程序_第19张图片
综上插入的三个条目,在主条目管理界面显示出来
Python使用Django开发web应用程序(二)创建应用程序_第20张图片

6、Django shell

输入一些数据后,就可以通过交互式终端会话以编程方式查看这些数据。这种环境称为Django shell,是用来测试项目以及排除其他故障的理想之地:

python manage.py shell

from learning_lops.models import Topic

Topic.objects.all()

python manage.py shell
利用python manage.py shell启动一个python解释器,可使它来探索存储在项目数据库中的数据。
learning_lops.models
导入模块learning_lops.models中的模型Topic
Topic.objects.all()
在使用方法Topic.objects.all()来获取模型Topic的所有实例,返回的是一个列表

如下图所示:
Python使用Django开发web应用程序(二)创建应用程序_第21张图片
我们可以像遍历列表一样遍历查询表

from learning_lops.models import Topic

Topic.objects.all()

topics=Topic.objects.all()
for topic in topics:
	print(topic.id,topic)

将返回的值存储在topics中打印每个主题id,以及主题

效果如下图所示:
Python使用Django开发web应用程序(二)创建应用程序_第22张图片
通过对象的ID后,就可以获得该对象并查看其任何属性

t=Topic.objects.get(id=1)
t.text

t.date_added

查看Chess的属性text和date_added

效果图如下所示:
Python使用Django开发web应用程序(二)创建应用程序_第23张图片
我们可以查看与主题相关联的条目,前面我们给模型Entry定义了属性topic,这是一个ForeignKey,将条目与主题关联起来,Django能够获取与特定主题相关联的所有条目。

t.entry_set.all()

效果图如下所示:
在这里插入图片描述

你可能感兴趣的:(Django)