Django入门笔记——第八章、模板引擎设置
第八章、模板引擎设置
回顾
要显示文章标题,就要把标题从数据库中先读取出来。我们在创建BlogArticles
模型时,有一个专门的title
字段存储文章标题,那么怎么读取到它呢?通过前面学习笔记,
- 一种是通过
SQL
语句进行查询 -- select语句 - 另一种就是通过Django自带的API进行读取,这个功能强大的API还可以创建、获取、修改和删除对象
显示文章标题
在manage.py
所在的目录创建一个名为 templates的新文件夹:
myblog/
| |-- blog
| |-- myblog/
| |-- templates/ <-- 这里
| +-- venv/
| +-- db.sqlite3
| +-- manage.py
建立的目录如下图:
在这里插入图片描述
创建home.html文件
然后在templates文件夹中,创建一个名为home.html
的HTML文件:
templates/home.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>我的博客</title>
</head>
<body>
<h1>我的博客</h1>
{% for blog in blogs %}
<li>{{ blog.title }} </li> <br>
{% endfor %}
</body>
</html>
在home
中,我们使用了原始HTML和一些特殊标签 {% for ... in ... %}
和 {{ variable }}
。它们是Django模板语言的一部分。
Django模板语言都需要用到{}
花括号,块标签{%block name %}
,用来包裹块内容,表示其间的内容可以自定义,name是块的名称。块结束标签{% endf-block%}
。
上面的例子展示了如何使用 for
遍历列表对象,这一点类似Python的循环语句,{% for blog in blogs %}
是循环的开始,{% endfor %}
是本循环结束。
{{ blog.title }}
双层花括号的方式表示此处显示变量引用的数据。blog是从blogs的QuerySet序列中得到的一个实例对象,blog.title是某个实例的title字段,我们通过这种方式获得一片博客的标题,最后生成动态HTML文档。
在使用这个HTML页面之前,我们必须告诉Django在哪里可以找到我们应用程序的模板(注:如果是利用Pycharm创建的Django项目,则会自动生成templates)。
打开myproject目录下面的settings.py文件,搜索TEMPLATES
变量,并设置DIRS
的值为 os.path.join(BASE_DIR, 'templates')
:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'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',
],
},
},
]
创建home视图:
在我们完成对home
模板创建完成后,接下来开始写home()
函数:
blog/views.py
from django.shortcuts import render
from .models import BlogArticles
# Create your views here.
def home(request):
blogs = BlogArticles.objects.all()
return render(request, "home.html", {"blogs":blogs})
还记得当初第三章中写HelloWorld
页面时编写的welcome()
函数吗?同样,home()
是在视图文件views.py
中编写的一个函数,这种方式被称为“基于函数的视图”,这个函数就叫“视图函数”,后面还将学到“基于类的视图”。
为了响应用户请求,然后我们利用前面交互模式中使用的语句blogs = BlogArticles.objects.all()
,得到所有的BlogArticles类实例。
然后再以return结束当前函数,并返回结果。
render()
的作用是将数据渲染到指定模板,第一个参数必须是request,然后是模板位置和所传送的数据,数据是用类字典的形式传送给模板的。
home.html
就是展示标题列表的前端页面--被称为“模板”。在每一个应用中都可以有一个专门的模板目录,这个目录的名称必须是templates。
{"blogs":blogs}
向模板文件home.html
中传入blogs变量所引用的QuerySet对象,其包含所有BlogArticles类的实例对象,即从数据库中读取所有记录,并在模板文件中以变量blogs({"blogs":blogs}
)中的键blogs来代表。
更新urls:
函数和模板都写好了之后,我们还需要做一项工作,就是进行URL配置,相信大家在学完第三章后应该知道在哪个文件中进行URL配置了吧,对就是myblog/urls.py
文件中。增加如下新增代码:
myblog/urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import url # 新增
from blog import views # 新增
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^$', views.home, name='home'), # 新增
]
Final成果
最后在浏览器中打开 http://127.0.0.1:8000/,结果如下图,能一个简单的HTML页面展示:
在这里插入图片描述
可以看到,自己创建的博客文章标题已经显示在浏览器中,相信到这一步你已经激动不已(笔者也是)。细心的读者可以会问了,只是展示了标题,可是并不能通过点击博客文章标题查看博客内容,对,下一章的任务就是带领大家完成查看博客文章。
- Enterprise Library深入解析与灵活应用(9):个人觉得比较严重的关于CachingCallHandler的Bug
- 无锁编程(四) - CAS与ABA问题
- Linux Kernel CMPXCHG函数分析
- 无锁编程(五) - RCU(Read-Copy-Update)
- 无锁编程(六) - seqlock(顺序锁)
- 无锁编程(七) - 实战
- zookeeper的python客户端安装
- 事件(Event),绝大多数内存泄漏(Memory Leak)的元凶[上篇]
- 震撼:1分钟带你看完IC0的爆炸视频
- 事件(Event),绝大多数内存泄漏(Memory Leak)的元凶[下篇] (提供Source Code下载)
- bt、磁力怎么下载?老司机飙车终极思路……
- Linux进程间通信(五) - 信号灯(史上最全)及其经典应用案例
- 写出完美的snprintf
- 计算CPU利用率
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python socket 简单示例
- 深入了解C++虚函数
- Mathematica 在高考数学与高等数学等学习中的简单应用与思考
- 数据结构之【实现数组】
- 数据结构【单链表基本操作】
- Django Models 随机获取指定数量数据方法
- 数据结构【静态栈】代码实现
- Qt官方示例解析-Address Book-基于单个数据模型在不同视图呈现不同数据
- React 中请求远程数据的四种方法
- 数据结构【动态队列】代码实现
- C++抽象工厂
- 数据结构【动态栈】代码实现
- UOS安装chrome谷歌浏览器依赖Fonts-Liberation的问题
- UOS修改盘符名称(像windows的C、D、E盘)
- 【原创】Java并发编程系列29 | ConcurrentLinkedQueue