Django学习笔记

来源: 实验楼
链接: 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/<int:year>', views.year_archive),
]

urls.py 指出了什么样的 URL 调用什么视图。 在这个例子中 books/xxxxx 将会调用 year_archive() 这个函数。也就是说,在进入这个链接时,会返回视图函数的结果。

templates

# /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 %},它试图将函数返回的结果显示在网页上。

层次结构

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

在我们创建的图书馆应用中,需要创建一个模型BookBook模型包括四个字段:书名、作者、出版社、出版日期。

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所有对象
<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

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
<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 ... %} 标签内部使用。

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循环等)需要注意

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • 建立第一个项目 新建工程 进入你要建立工程的目录,键入如下命令(其中mysite是你的项目名称): django-...
    小小白老鼠阅读 712评论 0 1
  • 去年的事情特别多,也没有什么时间充电学习。今年目测轻松一点,年初本来计划就好好休息一下,结果一晃2017就度过了一...
    灰豹儿阅读 624评论 0 2
  • 笔记来源:自强学堂-Django教程这个教程真的非常好用!强烈推荐 Django简介-组成部分 urls.py:网...
    LeeLom阅读 1,505评论 0 2
  • 上片文章讲解模板。你本文将讲解 “MTV” 中 M 层次,即模型层(数据存取层)。模型这内容比较多,我将其拆分为 ...
    猴哥爱读书阅读 939评论 0 2
  • django迁移无效问题解决 背景 Django是一个开放源代码的Web应用框架 Django遵守BSD版权,初次...
    renyangfar阅读 212评论 0 1