Python 入门项目——Django入门(上)

简介: Python 入门项目——Django入门

文章目录

建立项目

指定规范

建立虚拟环境

安装 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

20201124231636200.png


也可以下载 Django-3.1.3-py3-none-any.whl 文件安装,下载链接

使用下面命令来安装。


py -m pip install --user .\Django-3.1.3-py3-none-any.whl


验证安装成功:

20201125211831717.png

在 Django 中创建项目

在还处于活动的虚拟环境的情况下,执行以下命令来新建一个项目:


django-admin.py startproject learning_log .


这里使用 Django 新建一个名为 learning_log 的项目。命令末尾的句点使得新项目使用合适的目录结构,这样开发完成后可以轻松地将应用程序部署到服务器上。


查看项目结构:

20201125213511616.png

这里简单说明一下项目中的各个文件:


  • settings.py 重要文件,指定 Django 如何与你的系统交互以及如何管理项目
  • urls.py 重要文件,告诉 Django 应该创建那些网页来响应浏览器请求
  • wsgi.py 重要文件,帮助 Django 提供它创建的文件(web server gateway interface)

创建数据库

Django 将大部分与项目相关的信息都存储到数据库中,所以我们还需要创建一个供 Django 使用的数据库。为项目 “学习笔记” 创建数据库,继续在虚拟环境下执行下面命令:


py manage.py migrate

2020112521400888.png

将修改数据库成为迁移数据库。首次执行命令 migrate 时,将让 Django 确保数据库与项目的当前状态匹配。在使用 SQLite 的新项目中首次执行这个命令时,Django 将新建一个数据库。这里给出了需要在数据库表中创建的必要的信息:admin 、auth 、contenttypes 、sessions。此时就可以看到在 manage.py 所在目录下就新建了一个文件——db.sqlite3。


查看项目

下面就来核实 Django 是否正确创建了项目,执行 runserver 命令,如下显示:

20201125214702897.png

在浏览器中输入这里的 server url:http://127.0.0.1:8000/,显示如下界面:

20201125214809227.png

创建应用程序

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 后面会提到。

20201125215557263.png

定义模型

现在根据 “学习笔记” 项目来思考一下需要涉及的数据。

每位用户都需要创建很多主题,而很多条目斗鱼主题相关联,这些条目又都是以文本方式显示。此外,我们还需要存储每个条目的时间戳,以方便告诉用户这些条目都是什么时候创建的。


打开 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

20201127224432127.png

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


下面来应用这种迁移,让 Django 帮我修改数据库:


$ py.exe manage.py migrate

20201127230304663.png

这个命令的大部分输出都与我们首次执行命令 migrate 的输出相同,这里, Django 确认一切正常。


每当需要修改项目管理的数据时,都要采用以下三个步骤:


  • 修改 models.py
  • 对 learning_logs 调用 makemigrations
  • 让 Django 迁移项目

Django 管理网站

为应用程序低昂有模型时, Django 提供的管理网站(admin site) 使得可以轻松处理模型。网站的管理员能够使用管理网站,而普通用户不能使用。这里,我们将建立管理网站,并通过使用模型 Topic 来添加一些主题。


  1. 创建超级用户
  2. Django 允许你创建具备所有权限的用户——超级用户。权限决定了用户可执行的操作。最严格的权限设置只允许用户浏览阅读网站的公开信息;注册了的用户通常可以阅读自己的私有数据,还可以查看一些只有会员才能查看的信息。为有效地管理 Web 应用程序,网站所有者通常需要访问网站存储的所有信息。优秀的管理员会小心对待用户的敏感信息,因为用户对其访问的应用程序有极大的信任。

在 Django 中创建超级用户,需要执行下面命令:

$ python manage.py createsuperuser

20201127231221795.png


当执行命令 createsuperuser 时,Django 提示你输入超级用户的用户名,这里输入 11_admin ,后面会紧接着输入电子邮件地址(也可以为空),然后就是设置用户密码。


  1. 向管理网站注册模型

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 使得服务运行起来。如下:

20201127232127469.png

3. 添加主题

向管理网站注册 Topic 后,我们来添加第一个主题。为此,单击 Topic 进入主题网页,它几乎是空的,这是因为这里我们没有添加任何的主题。单击 Add ,将看到一个用于添加新主题的表单,表单的第一个方框输入 Chess ,单击 Save ,将反悔到主题管理页面,其中就会显示刚刚创建添加的主题:

20201127232439934.png

20201127232459421.png

紧接着,继续创建一个主题 Rock Climbing ,这样就添加完成两个新主题了。如下:

20201127232620895.png

定义模型 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

20201128082946487.png

生成了新的迁移文件——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 的管理页面,能看到此时已经出现的新添加的模型:


20201128083552265.png20201128083645822.png20201128083708222.png20201128083919989.png




相关文章
|
1天前
|
存储 程序员 API
Python 入门指南(五)(4)
Python 入门指南(五)
11 1
|
1天前
|
Python 索引 C语言
Python3从零基础到入门(2)—— 运算符-3
Python3从零基础到入门(2)—— 运算符
|
1天前
|
NoSQL 测试技术 API
Python 入门指南(七)(4)
Python 入门指南(七)
9 0
|
1天前
|
测试技术 程序员 数据库
Python 入门指南(七)(3)
Python 入门指南(七)
7 0
|
1天前
|
存储 设计模式 程序员
Python 入门指南(七)(2)
Python 入门指南(七)
9 1
|
1天前
|
XML 算法 uml
Python 入门指南(七)(1)
Python 入门指南(七)
11 0
|
1天前
|
机器学习/深度学习 存储 算法
Python 入门指南(六)(4)
Python 入门指南(六)
8 1
|
1天前
|
设计模式 存储 安全
Python 入门指南(六)(3)
Python 入门指南(六)
10 0
|
1天前
|
存储 缓存 索引
Python 入门指南(六)(2)
Python 入门指南(六)
8 1
|
1天前
|
存储 缓存 程序员
Python 入门指南(六)(1)
Python 入门指南(六)
8 1