来源: 实验楼
链接: https://www.shiyanlou.com/courses/1127
实验楼学习实验报告
Django
Django MVC模式
3个Python文件
1.model M
数据库的代码表示方法,通过Python类实现数据库,代替SQL语句。
2.view V
在view中引用model,通常,视图根据参数检索数据,加载一个模板,并使用检索到的数据呈现模板。
from django.shortcuts import render
from .models import Person
def book_archive(request,year):
book_list=Person.object.filter(birth_year=year)
context={'year':year,'book_list':booklist}
return render(request,'books/year_archive.html',context)
3.url 建立映射关系
# myProject/myApp/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('books/', views.year_archive),
]
urls.py
指出了什么样的 URL 调用什么视图。 在这个例子中 books/xxxxx
将会调用 year_archive()
这个函数。也就是说,在进入这个链接时,会返回视图函数的结果。
templates
# /template/year_archive.html
{% block title %}Books for {{ year }}{% endblock %}
{{% block content %}}
Articles for {{years}}
{% for book in book_list %}
{{ book.name }}
Published {{ book.pub_date|date:"F j, Y" }}
{% endfor %}
{% end block %}
year_archive.html
是 html 模板。 使用带基本逻辑声明的模板语言,如{% for book in book_list %}
,它试图将函数返回的结果显示在网页上。
层次结构
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py #url声明
wsgi.py
lib/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
例子
view
lib下view.py
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world!")#得到一个回复
lib下urls.py
# lib/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
'''
route为空意味着我们可以直接用链接http://localhost:8000/lib/访问该视图函数,view=view.index是调用了view.py中的index视图,name为index代表我们可以在模板中用index来引用返回的变量。
'''
参数 | 意义 | 是否必须 |
---|---|---|
route | route 是一个匹配 URL 的准则(类似正则表达式)。当 Django 响应一个请求时,它会从 urlpatterns 的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项。 | 必须 |
view | 当 Django 找到了一个匹配的准则,就会调用这个特定的视图函数,并传入一个 HttpRequest 对象作为第一个参数,被“捕获”的参数以关键字参数的形式传入。 | 必须 |
kwargs | 任意个关键字参数可以作为一个字典传递给目标视图函数。 | 可选 |
name | 为你的 URL 取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个 URL 模式 | 可选 |
接下来,我们需要向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 以供进一步处理。
'''
models
在我们创建的图书馆应用中,需要创建一个模型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
。这个参数的用处不止于用来定义数据结构,也用于验证数据
激活模型需要安装lib应用
# mysite/mysite/settings.py
INSTALLED_APPS = [
'lib.apps.LibConfig',
'django.contrib.admin',
...
]
然后进行迁移,可检测数据库创建语句是否正确
现在尝试一下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所有对象
>>>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=)
记住,改变模型需要这三步:
- 编辑
models.py
文件,改变模型。 - 运行
python manage.py makemigrations
为模型的改变生成迁移文件。 - 运行
python manage.py migrate
来应用数据库迁移。
template
HTML
在 mysite/mysite/settings.py
文件中的 TEMPLATES
配置项描述了 Django 如何载入和渲染模板。默认的设置文件设置了 DjangoTemplates
后端,并设置 APP_DIRS = True
。这一选项将会让 DjangoTemplates
在每个 INSTALLED_APPS
文件夹中寻找 templates
子目录。
新建模板文件 lib/templates/lib/detail.html
,并向其中写入如下代码:
# lib/templates/lib/detail.html
Book List
书名
作者
出版社
出版时间
{% for book in book_list.all %}
{{ book.name }}
{{ book.author }}
{{ book.pub_house }}
{{ book.pub_date }}
{% endfor %}
模板统一使用点符号.
来访问变量的属性。在示例 {{ book.name }}
中,首先 Django 尝试对 book 对象使用字典查找(也就是使用 obj.get(str)
操作),如果失败了就尝试属性查找(也就是 obj.str
操作),结果是成功了。如果这一操作也失败的话,将会尝试列表查找(也就是 obj[int]
操作)。
在 {% for ... in ... %}
循环中发生的函数调用:book_list.all
被解释为 Python 代码 book_list.objects.all()
,将会返回一个可迭代的 Book
对象,这一对象可以在 {% for ... in ... %}
标签内部使用。
view.py
现在我们要创建视图来返回图书列表:
# mysite/lib/views.py
from django.shortcuts import render
from .models import Book
def detail(request):
book_list = Book.objects.order_by('-pub_date')[:5]
context = {'book_list': book_list}
return render(request, 'lib/detail.html', context)
在此视图函数detail
中,首先将数据库的Book列表按照pub_date
时间来排序,存储到变量book_list
中。
「载入模板,填充上下文,再返回由它生成的 HttpResponse 对象」是一个非常常用的操作流程。于是 Django 提供了一个快捷函数render()
。
render()
函数把request
对象作为它的第一个参数,模板作为第二个参数,字典作为它的可选的第三个参数。它返回给定模板呈现的给定文本的一个HttpResponse
对象。
在这里,context
信息将会返回到模板lib/detail.html
。
将新视图添加进lib.urls模块里:
# lib/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('detail/', views.detail, name='detail'),
]
综述总结
summary
view.py:处理各种事件的方法,包括对数据库各种增删改查,实现response等。
数据库增添操作
>>>b = Book(name='Business', author='Tom', pub_house='First Press', pub_date=timezone.now()) #创建
>>>b.save() #保存
lib下URL:实现URL对应
# lib/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('detail/', views.detail, name='detail'),
]#URL,对应处理方法
'''
route为空意味着我们可以直接用链接http://localhost:8000/lib/访问该视图函数,view=view.index是调用了view.py中的index视图,name为index代表我们可以在模板中用index来引用返回的变量
数据库 模型
lib下的model.py需要mysite/mysite/setting.py中激活,然后进行迁移
HTML文件有一些固定的写法(如for循环等)需要注意