你好,我是goldsunC
让我们一起进步吧!
在以下链接快速回顾系列文章内容
从0到1搭建个人博客-Django(一)
从0到1搭建个人博客-Django(二)
从0到1搭建个人博客-Django(三)
从0到1搭建个人博客-Django(四)
本篇内容简单改写下视图函数,然后编写模板(Template)
做了个简单的页面标题输出。同时对Django模板语言做了介绍以及配置好了Bootstrap4环境。
在前一篇文章,我们已经创建了数据库,也建立了模型类并实现了数据迁移,这一章我们从数据库中国读取数据并展示在浏览器页面。
好的,知道了简单的需求,那我们想想应该改写设置哪些文件呢?
首先,我们需要借助模型从数据库中读取数据,然后通过视图将数据展示在浏览器页面上。
模型类我们已经理解一些了,那视图呢?如果认真学习的小伙伴应该知道我们已经简单的实现过视图了,在第二篇文章中为了让我们小有成就感,简单的编写了一个视图,使浏览器页面左上角出现了一个小小的Hello world!
。
还记得Hello world!
页面的网址吗?如果不急得的话去路由文件里面看看,知道怎么看吗?首先找到项目路由文件my_blog\urls
,里面有一行:
path('article/', include('article.urls',namespace = 'article')),
说明如果如果来的路由地址是http://127.0.0.1:8000/article/*
的话,去article\urls
下去匹配路由,注意那个*
号,在这里我将它当作是统配符的意思,即只要前面是article
就到article\urls
下去匹配视图函数,那我们打开article\urls
文件,里面只要一个:
path('',views.HelloWorld, name = 'HelloWorld'),
那个空字符串的意思就是没有空参数啦,也就是匹配http://127.0.0.1:8000/article/
了,这个网址的话去调用views
中的HelloWorld
函数,也就是返回一个HttpResponse
对象Hello world!
,这样我们就在浏览器页面上看到了它,这么说你能理解吗?
如果理解了,那我们准备好改写视图,Hello world!
的作用已经够了,该舍弃它了。
视图功能简称"View"
,是一系列的Python函数,它接受一个Web请求,然后返回一个Web响应。这个响应可以直接是Web页面的HTML内容,或重定向、404错误、XML文档、图像等。创建视图是在views.py
文件中创建视图函数,这个函数会进行相应的操作。当Django服务器接收到特定的url后,通过该url路由找到相应的视图函数,调用该视图函数,然后models
去访问数据库取数据,然后通过模板(Template)
,Views函数把响应对象返回客户端最终显示出来。视图函数是由框架发起调用的,不需要直接调用视图函数。
在编写视图函数时,每一个视图函数至少有一个request
参数,这是一个触发这个视图、包含当前Web请求信息的对象,是类django.http.HttpRequest
的一个实例。例如我们之前的Hello world!
就是一个django.http.HttpRequest
的实例。
打开article/views.py
文件,改写文件内容如下:
from django.shortcuts import render
# Create your views here.
# 导入我们的数据类ArticlePost
from .models import ArticlePost
def article_list(request):
articles = ArticlePost.objects.all()
context = {
'articles':articles
}
return render(request, 'article/list.html', context)
简单分析一下:
render
是一个渲染函数,它负责渲染视图调用的模板(Template)
,简单讲模板就是一个大致的编写好的HTML页面,然后我们有时候需要更改模板页面中的一些内容,render函数就负责把更改后的内容和模板渲染出来通过浏览器呈现。ArticlePost
就是我们之前创建好的模型类。article_list
函数的作用就是:首先获得ArticlePost
表(注意我们说过一个模型类就是一张表,每一个实例就是一行数据)的所有对象即所有数据,然后context
定义了需要传递给模板的内容,这里只传递了articles
,最好返回渲染好的HttoResponse
对象。render
函数中的三个参数:
request
:这个参数就是浏览器传过来的请求。article/list.html
:这个HTML文件是我们的一个模板,大家会发现我们现在并没有这个文件啊,是的我们还没有创建这个文件,不过先照着写,马上创建。context
:它就是需要传入模板的内容,等下结合模板文件更好理解。在项目文件my_blog
下创建新目录templates
,然后在其下新建article
目录,再在其下新建list.html
文件,创建完成后项目目录如下:
my_blog
│ db.sqlite3
│ manage.py
│
├─article
│
├─my_blog
│
└─templates
└─article
list.html
在list.html
中写入如下代码:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>我的博客title>
head>
<body>
{% for article in articles %}
<h1 align="center">{{ article.title }}h1>
{% endfor %}
body>
html>
编写好之后打开my_blog/settings.py
,找到如下代码片段并在'DIRS'
列表中增加一行代码:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 定义我们的模板位置,让Django可以加载
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
然后修改article
的路由,打开article/urls.py
文件,做如下修改:
# 2020.10.14更改代码
urlpatterns = [
path('article-list/',views.article_list, name = 'article_list'),
]
重新定义我们的视图函数
完毕后,虚拟环境启动服务器,输入哪个网址呢?当然是这个:
http://127.0.0.1:8000/article/article-list/
,出现如下界面:
如图,显示了数据库中每篇文章的标题,注意是每一篇,我这里只有一个标题是因为我上次新建文章的时候只新建了一个,如果你当时新建了多个,那所有标题都会显示在上面,如果不信的话可以去试试哦,什么?忘了怎么创建?那还是建议你多去折腾折腾,大不了重头再来,只有理解了才好。
Django模板引擎提供了一个小型的语言来定义应用程序面向用户的层。先简单介绍下上面list.html
文件中使用到的代码(不会HTML的建议找点资料看看,几个小时就能入门):
{% for article in articles %}
:articles
为视图函数context
传递过来的 上下文,即所有文章标题的集合,可以去views.py
中回顾一下。语法看着和Python的for语句相似是吧,其实就是那回事,for标签用于顺序遍历序列中的每条数据。每次循环模板系统都会渲染{% for %}
和{% endfor %}
之间的所有内容。
{{article.title}}
:它表示将article
变量的title
值插入我们的模板中。
Django模板语言还有其它的一些使用方法:
语法格式:{{var | filters}}
模板过滤器将变量在显示前转换它们的值的方式。例如:
{{string | lower}}
,它将字符转换为小写。
{{string | truncatewords:10}}
,过滤器将截断字符串,只显示前10个字符。
被{% %}
包围的是块标签。标签可以执行以下操作:if条件判断、for循环和模板继承等,我们刚才使用的就是for循环。
if条件判断
:和Python中if语句差不多,例如如下代码:<html>
<body>
<p>{{response}}p>
Hello,I am goldsunC! Do you like me?
{% if response.answer == 'Yes'%}
I love you,too.
{% elif response.answer == 'No'%}
GUN
{% else %}
Repeat,please.
{% endif %}
body>
html>
这个模板可以根据视图函数传递过来的response
的answer
属性来渲染不同的答案。
for循环
语法格式:
{% for 变量 in 列表 %}
执行语句
{% endfor %}
ifequal/ifnotequal
标签:用于比较模板中两个变量的值是否相等。语法格式:
{% ifequal/ifnotequal user currentuser %}
执行语句
{% endifequal %}
block标签
{% block %}
模板标签,它告诉模板引擎一个子模版可能覆盖模板的这部分内容。
extends标签
这是一个模板继承标签,模板继承使用户能够见一个"基础"模板,里面包含用户网站的通用部分,并且在里面定义子模版可以覆盖的"块"。
语法格式:
{% extends "父模板文件名" %}
这个标签必须放在所有模板标签的最前面,否则模板继承不工作。
注释标签
Django中模板语言允许使用注释{# #}
。注释标签用来为模板定义注释,他不是HTML注释,不会出现在HTML页面中。它只可以是一个文件或注释一行代码。一个注释不能分成多行。
Bootstrap是用于网站开发的开源前端框架,它提供字体排印、窗体、按钮、导航及其他各种组件,旨在使动态网页和Web应用的开发更加容易。
首先我们需要下载Bootstrap4
文件,又因为bootstrap.js
依赖jquery.js
才能正常运行,因此这个文件我们也需要一并下载保存。
下载之前我们先在项目文件夹my_blog
下创建static
文件夹目录,再在其下创建bootstrap
、jquery
两个文件夹目录。然后下载两个文件:
bootstrap
:https://getbootstrap.com/docs/4.1/getting-started/download/
jquery.js
:https://jquery.com/download/
记得解压,完成之后目录结构如下:
my_blog
│ db.sqlite3
│ manage.py
│ │
├─article
│ │
├─my_blog
│
├─static
│ ├─bootstrap
│ │ ├─css
│ │ │
│ │ └─js
│ │
│ └─jquery
│ jquery-3.5.1.js
│
└─templates
└─article
list.html
然后更改配置让Django能调用它们,打开setting.py
文件,在文件的最末尾加上如下代码:
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
参考文献: