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




相关文章
|
4天前
|
数据采集 存储 XML
Python爬虫定义入门知识
Python爬虫是用于自动化抓取互联网数据的程序。其基本概念包括爬虫、请求、响应和解析。常用库有Requests、BeautifulSoup、Scrapy和Selenium。工作流程包括发送请求、接收响应、解析数据和存储数据。注意事项包括遵守Robots协议、避免过度请求、处理异常和确保数据合法性。Python爬虫强大而灵活,但使用时需遵守法律法规。
|
5天前
|
Python
深入理解Python装饰器:从入门到实践####
本文旨在通过简明扼要的方式,为读者揭开Python装饰器的神秘面纱,从基本概念、工作原理到实际应用场景进行全面解析。不同于常规的摘要仅概述内容概要,本文将直接以一段精炼代码示例开篇,展示装饰器如何优雅地增强函数功能,激发读者探索兴趣,随后深入探讨其背后的机制与高级用法。 ####
32 11
|
2天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
1天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
1天前
|
设计模式 缓存 开发框架
Python中的装饰器:从入门到实践####
本文深入探讨了Python中装饰器的工作原理与应用,通过具体案例展示了如何利用装饰器增强函数功能、提高代码复用性和可读性。读者将学习到装饰器的基本概念、实现方法及其在实际项目开发中的实用技巧。 ####
11 3
|
4天前
|
机器学习/深度学习 数据采集 数据可视化
Python在数据科学中的应用:从入门到实践
本文旨在为读者提供一个Python在数据科学领域应用的全面概览。我们将从Python的基础语法开始,逐步深入到数据处理、分析和可视化的高级技术。文章不仅涵盖了Python中常用的数据科学库,如NumPy、Pandas和Matplotlib,还探讨了机器学习库Scikit-learn的使用。通过实际案例分析,本文将展示如何利用Python进行数据清洗、特征工程、模型训练和结果评估。此外,我们还将探讨Python在大数据处理中的应用,以及如何通过集成学习和深度学习技术来提升数据分析的准确性和效率。
|
1天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
3天前
|
机器学习/深度学习 数据挖掘 开发者
Python编程入门:理解基础语法与编写第一个程序
【10月更文挑战第37天】本文旨在为初学者提供Python编程的初步了解,通过简明的语言和直观的例子,引导读者掌握Python的基础语法,并完成一个简单的程序。我们将从变量、数据类型到控制结构,逐步展开讲解,确保即使是编程新手也能轻松跟上。文章末尾附有完整代码示例,供读者参考和实践。
|
3天前
|
人工智能 数据挖掘 程序员
Python编程入门:从零到英雄
【10月更文挑战第37天】本文将引导你走进Python编程的世界,无论你是初学者还是有一定基础的开发者,都能从中受益。我们将从最基础的语法开始讲解,逐步深入到更复杂的主题,如数据结构、面向对象编程和网络编程等。通过本文的学习,你将能够编写出自己的Python程序,实现各种功能。让我们一起踏上Python编程之旅吧!
|
4天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第36天】本文将带你走进Python的世界,从基础语法出发,逐步深入到实际项目应用。我们将一起探索Python的简洁与强大,通过实例学习如何运用Python解决问题。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供有价值的指导和灵感。让我们一起开启Python编程之旅,用代码书写想法,创造可能。