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天前
|
开发者 Python
Python入门:8.Python中的函数
### 引言 在编写程序时,函数是一种强大的工具。它们可以将代码逻辑模块化,减少重复代码的编写,并提高程序的可读性和可维护性。无论是初学者还是资深开发者,深入理解函数的使用和设计都是编写高质量代码的基础。本文将从基础概念开始,逐步讲解 Python 中的函数及其高级特性。
Python入门:8.Python中的函数
|
1天前
|
存储 索引 Python
Python入门:6.深入解析Python中的序列
在 Python 中,**序列**是一种有序的数据结构,广泛应用于数据存储、操作和处理。序列的一个显著特点是支持通过**索引**访问数据。常见的序列类型包括字符串(`str`)、列表(`list`)和元组(`tuple`)。这些序列各有特点,既可以存储简单的字符,也可以存储复杂的对象。 为了帮助初学者掌握 Python 中的序列操作,本文将围绕**字符串**、**列表**和**元组**这三种序列类型,详细介绍其定义、常用方法和具体示例。
Python入门:6.深入解析Python中的序列
|
1天前
|
程序员 UED Python
Python入门:3.Python的输入和输出格式化
在 Python 编程中,输入与输出是程序与用户交互的核心部分。而输出格式化更是对程序表达能力的极大增强,可以让结果以清晰、美观且易读的方式呈现给用户。本文将深入探讨 Python 的输入与输出操作,特别是如何使用格式化方法来提升代码质量和可读性。
Python入门:3.Python的输入和输出格式化
|
1天前
|
机器学习/深度学习 人工智能 算法框架/工具
Python入门:1.Python介绍
Python是一种功能强大、易于学习和运行的解释型高级语言。由**Guido van Rossum**于1991年创建,Python以其简洁、易读和十分工程化的设计而带来了庞大的用户群体和丰富的应用场景。这个语言在全球范围内都被认为是**创新和效率的重要工具**。
Python入门:1.Python介绍
|
1天前
|
缓存 算法 数据处理
Python入门:9.递归函数和高阶函数
在 Python 编程中,函数是核心组成部分之一。递归函数和高阶函数是 Python 中两个非常重要的特性。递归函数帮助我们以更直观的方式处理重复性问题,而高阶函数通过函数作为参数或返回值,为代码增添了极大的灵活性和优雅性。无论是实现复杂的算法还是处理数据流,这些工具都在开发者的工具箱中扮演着重要角色。本文将从概念入手,逐步带你掌握递归函数、匿名函数(lambda)以及高阶函数的核心要领和应用技巧。
Python入门:9.递归函数和高阶函数
|
1天前
|
存储 SQL 索引
Python入门:7.Pythond的内置容器
Python 提供了强大的内置容器(container)类型,用于存储和操作数据。容器是 Python 数据结构的核心部分,理解它们对于写出高效、可读的代码至关重要。在这篇博客中,我们将详细介绍 Python 的五种主要内置容器:字符串(str)、列表(list)、元组(tuple)、字典(dict)和集合(set)。
Python入门:7.Pythond的内置容器
|
1天前
|
存储 Linux iOS开发
Python入门:2.注释与变量的全面解析
在学习Python编程的过程中,注释和变量是必须掌握的两个基础概念。注释帮助我们理解代码的意图,而变量则是用于存储和操作数据的核心工具。熟练掌握这两者,不仅能提高代码的可读性和维护性,还能为后续学习复杂编程概念打下坚实的基础。
Python入门:2.注释与变量的全面解析
|
28天前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
106 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
1天前
|
知识图谱 Python
Python入门:4.Python中的运算符
Python是一间强大而且便捷的编程语言,支持多种类型的运算符。在Python中,运算符被分为算术运算符、赋值运算符、复合赋值运算符、比较运算符和逻辑运算符等。本文将从基础到进阶进行分析,并通过一个综合案例展示其实际应用。
|
29天前
|
数据管理 数据库 数据安全/隐私保护
Django—同一项目不同app使用不同数据库
在Django项目中实现不同app使用不同数据库的配置,可以通过配置多数据库、创建数据库路由和配置路由来实现。通过这种方法,可以有效地将数据隔离到不同的数据库,提高数据管理的灵活性和系统的可扩展性。希望本文能为开发者在Django项目中使用多数据库提供清晰的指导。
23 4

热门文章

最新文章

推荐镜像

更多