一、Django的认识
1、设计模型Model
Django无需数据库就可以使用,通过对象关系映射器(Object-relational mapping),仅使用Python代码就可以描述数据结构。
# myProject/myApp/models.py
form django.db import models
class book(models.Model):
name = models.CharField(max_length=100)
pub_date = models.DateField()
分析:
models.py
文件主要用一个 Python 类来描述数据表。 称为 模型(model) 。 运用这个类,你可以通过简单的 Python 代码来创建、检索、更新、删除 数据库中的记录而无需写一条又一条的SQL语句。 在这里我们创建了一个book模型,并定义了name和pub_date属性。
2、 设计视图Views
在模型被定义之后,我们便可以在视图中引用模型。通常,视图根据参数检索数据,加载一个模板,并使用检索到的数据呈现模板。
# myProject/myApp/views.py
from django.shortcuts import render
from .models import Person
def book_archive(request, year):
book_list = Person.objects.filter(birth_year = year)
context = {'year': year, 'book_list': book_list}
return render(request, 'books/year_archive.html', context)
分析:
views.py
文件包含了页面的业务逻辑。 book_archive()函数叫做视图。 这里还用到了year_archive.html
模板。
3 、设计链接Urls
优雅简洁的URL解析式是衡量高品质网站的重要标准。Django鼓励使用漂亮的URL设计。 使用这些优美的URL,只需要建立URL和Python回调函数简单的映射关系。
# myProject/myApp/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('books/<int:year>', views.year_archive),
]
分析:
urls.py
指出了什么样的 URL 调用什么视图。 在这个例子中 books/xxxxx
将会调用 year_archive()
这个函数。也就是说,在进入这个链接时,会返回视图函数的结果。
4、 设计模板Templates
Django拥有强大的模板功能,使用该模板能设计出强大的Web页面。
# /template/year_archive.html
{% block title %}Books for {{ year }}{% endblock %}
{{% block content %}}
<h1>Articles for {{years}}</h1>
{% for book in book_list %}
<p>{{ book.name }}</p>
<p>Published {{ book.pub_date|date:"F j, Y" }}</P>
{% endfor %}
{% end block %}
分析:
year_archive.html
是 html 模板。 使用带基本逻辑声明的模板语言,如{% for book in book_list %}
,它试图将函数返回的结果显示在网页上。
Django的这种结构我们称之为MTV模式:M代表模型(Model),T代表模板(Template),V代表视图(View)。这三个分别代表了三种不同功能的Web应用,各司其职,又彼此合作。 大家一定听说过MVC模式(Mode-View-Controller),MTV模式本质上与MVC相同,都是让各组件保持低耦合的关系。 关于MTV模式我们将在后面部分详细的讲解。
二、创建Django项目
1、创建Django项目 mysite
django-admin startproject mysite
以下是mysite
的目录结构:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
分析:
这些目录和文件的作用分别是:
-
外层的
mysite/
:是项目的容器,可以为任意名字。 -
manage.py
:一种让你可以使用各种方式管理Django项目的命令行工具。在mysite/
目录下输入python3 manage.py help
,看一看它都能做什么。 -
内层的
mysite/
:包含项目,是一个纯Python包。你可以在包里调用它内部的任何东西。 -
__init__.py
:一个空文件,告诉Python这个目录应该被认为是一个Python包。一般,你不需要去修改它。 -
settings.py
:Django项目的配置文件。 -
urls.py
:Django项目的URL声明。 -
wsgi.py
:作为项目的运行在WSGI兼容的Web服务器的入口。
2、启动Django
确认Django项目是否真的创建成功了,在有manage.py
文件存在的根目录里,运行以下的命令:
cd /home/shiyanlou/Code/mysite
python3 manage.py runserver
浏览器打开命令里的地址http://127.0.0.1:8000/
三、视图 View
1 、创建应用
Django中,每一个应用都是一个Python包,并且遵守着相同的约定。
Django自带一个工具,可以帮你生成应用的基本目录,极大地提高了开发效率。
进入mysite
文件夹,在终端中输入:
cd /home/shiyanlou/Code/mysite
python3 manage.py startapp lib
这将会创建一个名为lib
的目录,以下是它的目录结构:
lib/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
2、 开始编写视图
打开 lib/views.py
,输入以下代码:
# lib/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world!")
大家可以看出来,我们想要看到的就是在页面中输出Hello, world!
。
但仅编写视图函数,并不能在Django页面上显示出来。如果想要看到效果,我们需要使用URL来映射到它。
3、 lib/urls.py
在mysite/lib
目录里新建urls.py
文件,并输入以下代码:
# lib/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
这一步我们将应用lib
里视图函数与URL映射到了一起。
我们来详细讲解一下path()
函数,它共有4个参数:
参数 | 意义 | 是否必须 |
---|---|---|
route | route 是一个匹配 URL 的准则(类似正则表达式)。当 Django 响应一个请求时,它会从 urlpatterns 的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项。 | 必须 |
view | 当 Django 找到了一个匹配的准则,就会调用这个特定的视图函数,并传入一个 HttpRequest 对象作为第一个参数,被“捕获”的参数以关键字参数的形式传入。 | 必须 |
kwargs | 任意个关键字参数可以作为一个字典传递给目标视图函数。 | 可选 |
name | 为你的 URL 取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个 URL 模式。 | 可选 |
在上面的代码中,route
为空意味着我们可以直接用链接http://localhost:8000/lib/
访问该视图函数,view=view.index
是调用了view.py
中的index
视图,name
为index
代表我们可以在模板中用index来引用返回的变量。
接下来,我们需要向mysite/mysite/urls.py
告知使用应用lib
的视图。
输入以下代码:
# mysite/mysite/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('lib/', include('lib.urls')),
path('admin/', admin.site.urls),
]
实现的原理就是使用了include()
函数,它允许应用其他的URLconfs。
比如使用这个地址进行请求时:http://localhost:8000/lib/
,首先在mysite/mysite/urls.py
中会截断与此项匹配的 URL 部分,也就是lib/
,然后将剩余的字符串发送到 URLconf 以供进一步处理。
4 、 运行
到这里,我们就把index视图添加进了URLconf。
让我们来验证下它是否可以正常工作:
python3 manage.py runserver
使用浏览器访问http://localhost:8000/lib/
,
四、模型 Model
1、 配置数据库
Django的项目设置都包含在了mysite/mysite/settings.py
中。
对于数据库,配置文件使用了SQLite
作为默认的数据库文件。对于只是初步尝试Django的我们来说,这十分方便,无需再去配置其他的东西。
在实际开发中,我们会用到其它更具扩展性的数据库。例如MySQL
、Oracle
等。
如果你选择使用这些数据库,你需要安装相应数据库的绑定,然后改变设置文件中的DATABASE default
。
本课程默认使用SQLite数据库,想要使用其它数据库,可以参考 Django官方文档DATABASE。
记得配置设置文件中的TIME_ZONE
为自己所在地的时区,中国地区为Asia/Shanghai
。
TIME_ZONE = 'Asia/Shanghai'
2 、创建模型
模型是真实数据的简明描述。它包含了存储的数据所必要的字段和行为。Django遵循不要重复自己(DRY原则)。它的目标是让你只需要定义数据模型,然后其它的东西你都不用关心,都会自动从模型生成。
在我们创建的图书馆应用中,需要创建一个模型Book
。Book
模型包括四个字段:书名、作者、出版社、出版日期。
向`mysite/lib/models.py
# lib/models.py
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=200)
author = models.CharField(max_length=100)
pub_house = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
从代码可以看出,模型是django.db.models.Model类的子类。每个模型有一些类变量,它们都表示模型里的一个数据库字段。
每个字段都是Field类的实例。比如字符字段是CharField,日期字段被表示为DateTImeField。这将告诉Django每个字段要处理的数据类型。
定义某些Field类实例需要参数。如上面的max_length=100
中的max_length
。这个参数的用处不止于用来定义数据结构,也用于验证数据。
3、 激活模型
通过前面的代码,Django可以:
-
为这个应用创建数据库schema(生成 CREATE TABLE语句)。
-
创建可以与Book对象进行交互的Python数据库API。
为了实现上述功能,我们首先要将lib应用安装到我们项目中。
因为LibConfig
类写在文件lib/apps.py中,所以它的路径为lib.apps.LibConfig
在设置文件中添加路径:、
# mysite/mysite/settings.py
INSTALLED_APPS = [
'lib.apps.LibConfig',
'django.contrib.admin',
...
]
现在你的Django项目会包含lib应用。 运行下面的命令:
python3 manage.py makemigrations lib
通过运行 makemigrations
命令,Django 会检测你对模型文件的修改,并且把修改的部分储存为一次迁移。
现在运行migrate命令,在数据库里创建新定义的模型的数据表:
python3 manage.py migrate
4 、使用API
现在尝试一下Django为我们创建的各种API:
python3 manage.py shell
使用这个命令而不是简单的使用 "Python" 是因为 manage.py 会设置 DJANGO_SETTINGS_MODULE
环境变量,这个变量会让 Django 根据 mysite/settings.py
文件来设置 Python 包的导入路径。
>>>from lib.models import Book
>>>Book.objects.all() #获取Book所有对象
<QuerySet []>
>>>from django.utils import timezone
>>>b = Book(name='Business', author='Tom', pub_house='First Press', pub_date=timezone.now()) #创建
>>>b.save() #保存
>>>b.id
1
>>>b.name
'Business'
>>>b.pub_date
datetime.datetime(2018, 7, 4, 2, 29, 7, 578323, tzinfo=<UTC>)
记住,改变模型需要这三步:
-
编辑
models.py
文件,改变模型。 -
运行
python manage.py makemigrations
为模型的改变生成迁移文件。 -
运行
python manage.py migrate
来应用数据库迁移。
五、模板 Template
模板是一个文本,用于分离文档的表现形式和内容。
1、 创建模板
首先,在你的 mysite/lib
目录里创建一个 templates
目录。Django 将会在这个目录里查找模板文件。
在 mysite/mysite/settings.py
文件中的 TEMPLATES
配置项描述了 Django 如何载入和渲染模板。默认的设置文件设置了 DjangoTemplates
后端,并设置 APP_DIRS = True
。这一选项将会让 DjangoTemplates
在每个 INSTALLED_APPS
文件夹中寻找 templates
子目录。
新建模板文件 lib/templates/lib/detail.html
,并向其中写入如下代码:
# lib/templates/lib/detail.html
<h1>Book List</h1>
<table>
<tr>
<td>书名</td>
<td>作者</td>
<td>出版社</td>
<td>出版时间</td>
</tr>
{% for book in book_list.all %}
<tr>
<td>{{ book.name }}</td>
<td>{{ book.author }}</td>
<td>{{ book.pub_house }}</td>
<td>{{ book.pub_date }}</td>
</tr>
{% endfor %}
</table>
分析:
模板统一使用点符号.
来访问变量的属性。在示例 {{ book.name }}
中,首先 Django 尝试对 book 对象使用字典查找(也就是使用 obj.get(str)
操作),如果失败了就尝试属性查找(也就是 obj.str
操作),结果是成功了。如果这一操作也失败的话,将会尝试列表查找(也就是 obj[int]
操作)。
在 {% for ... in ... %}
循环中发生的函数调用:book_list.all
被解释为 Python 代码 book_list.objects.all()
,将会返回一个可迭代的 Book
对象,这一对象可以在 {% for ... in ... %}
标签内部使用。