Django教程 —— Django模板

清疚 2022-12-26 00:47 358阅读 0赞

引言

如何向请求者返回一个漂亮的页面呢?

肯定需要用到 html、css ,如果想要更炫的效果还要加入 js,问题来了,这么一堆字符串全都写到视图中,作为 HttpResponse() 的参数吗?

先看看如何拼接 html

  1. # -*- coding:utf-8 -*-
  2. """ @Author :Hui @Desc :{book应用视图模块} """
  3. from django.views import View
  4. from django.http import HttpResponse
  5. # /book/index
  6. def index(request):
  7. """图书首页"""
  8. if request.method == "GET":
  9. res_html = "<h1>GET请求 - 图书信息页</h1><br/>"
  10. books = ["射雕英雄传", "神雕侠侣", "倚天屠龙记"]
  11. res_html += "<ul>"
  12. for book in books:
  13. res_html += "<li>"
  14. res_html += book
  15. res_html += "</li>"
  16. res_html += "</ul>"
  17. return HttpResponse(res_html)

这样定义就太麻烦了吧,并且定义字符串是不会出任何效果和错误,如果有一个专门定义前端页面的地方就好了。

Django 中,将前端的内容定义在 模板 中,然后再把模板交给视图调用,各种漂亮、炫酷的效果就出现了。

运行环境

  • Python 3.9
  • Django 3.1.2

Django模板

创建模板

Django项目下创建 templates 目录然后在创建 book 目录,代表这存放着 book 应用的模板文件。

目录结构如下图:

模板目录结构

配置模板

Django 项目下的 setting.py 文件中找到 TEMPLATES 配置选项,配置如下目录路径

  1. 'DIRS': [BASE_DIR / 'templates']
  2. TEMPLATES = [
  3. {
  4. 'BACKEND': 'django.template.backends.django.DjangoTemplates',
  5. 'DIRS': [BASE_DIR / 'templates'], # 配置模板目录
  6. 'APP_DIRS': True,
  7. 'OPTIONS': {
  8. 'context_processors': [
  9. 'django.template.context_processors.debug',
  10. 'django.template.context_processors.request',
  11. 'django.contrib.auth.context_processors.auth',
  12. 'django.contrib.messages.context_processors.messages',
  13. ],
  14. },
  15. },
  16. ]
  17. BASE_DIR = Path(__file__).resolve().parent.parent

BASE_DIR 是你 Django 项目的绝对路径

可以在终端控制台输入如下命令

  1. python manage.py shell

打开项目的 shell 终端进行调试。

BASE\_DIR

定义模板

打开 templtes/book/index.html 文件,定义代码如下:

  1. <!DOCTYPE html>
  2. <html lang="zh-hans">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>图书信息</title>
  7. </head>
  8. <body>
  9. <h2>{ { title }}</h2>
  10. <ul>
  11. { % for book in books %}
  12. <li>{ { book.title }} --- { { book.author }}</li>
  13. { % endfor %}
  14. </ul>
  15. </body>
  16. </html>

在模板中输出变量语法如下,变量可能是从视图中传递过来的,也可能是在模板中定义的。

  1. { { 变量名 }}

在模板中编写代码段语法如下:

  1. { % 代码段 %}

更多模板语法这里就不一一叙述了。

视图调用模板

调用模板分为三步骤:

  • 找到模板
  • 定义上下文
  • 渲染模板

    from django.views import View
    from book.models import BookInfo
    from django.template import loader
    from django.http import HttpResponse

  1. # /book/info
  2. class InfoView(View):
  3. """图书信息视图类"""
  4. def get(self, request):
  5. # 从数据库中获取图书信息
  6. books = BookInfo.objects.all()
  7. # 获取模板
  8. tmp = loader.get_template('book/index.html')
  9. # 定义上下文
  10. context = {
  11. "title": "图书信息",
  12. "books": books,
  13. }
  14. # 渲染模板
  15. content = tmp.render(context)
  16. return HttpResponse(content)

在浏览器上访问 http://127.0.0.1:8000/book/info 效果如下图

图书信息

视图调用模板简写

视图调用模板都要执行以上三部分,于是 Django 提供了一个函数 render 封装了以上代码。

函数 render 包含3个参数:

  • 第一个参数为 request 对象
  • 第二个参数为 模板文件路径
  • 第三个参数为 字典,表示向模板中传递的 上下文数据

调用 render 的代码如下:

  1. from django.views import View
  2. from book.models import BookInfo
  3. from django.shortcuts import render
  4. # /book/info
  5. class InfoView(View):
  6. """图书信息视图类"""
  7. def get(self, request):
  8. # 从数据库中获取图书信息
  9. books = BookInfo.objects.all()
  10. # 定义上下文
  11. context = {
  12. "title": "图书信息",
  13. "books": books,
  14. }
  15. return render(request, "book/index.html", context)

公众号

新建文件夹X

大自然用数百亿年创造出我们现实世界,而程序员用几百年创造出一个完全不同的虚拟世界。我们用键盘敲出一砖一瓦,用大脑构建一切。人们把1000视为权威,我们反其道行之,捍卫1024的地位。我们不是键盘侠,我们只是平凡世界中不凡的缔造者 。

发表评论

表情:
评论列表 (有 0 条评论,358人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Django模板语法(django10)

    最近在折腾Django,看到官网的Django模板文章写得挺详细的,就想着翻译下以加深自己的学习印象,如果能帮助到大家我也会感到很欣慰,以下是译文。 这篇文章主要讲解了Dja

    相关 Django教程 —— Django模板

    引言 > 如何向请求者返回一个漂亮的页面呢? > > 肯定需要用到 `html、css` ,如果想要更炫的效果还要加入 `js`,问题来了,这么一堆字符串全都写到视图中

    相关 Django模板

    一、模板的组成 组成:HTML代码+逻辑控制代码 二、逻辑控制代码 1、变量:使用双大括号引起来的变量 例:<p>\{ \{name\}\}</p>

    相关 Django模板

    在前面的几节中我们都是使用简单的  django.http.HttpResponse 来把内容显示到网页上来的,本节中将讲解如何使用渲染模板的方法来显示内容 本节的