模板

之前的案例中,能够返回简单的字符串信息给浏览器。那如果想要返回html页面给浏览器该怎么做呢?

当然,我们可以这么写:

def index(request):return HttpResponse('<h1 style="color:red">我是硬编码的</h1>')

这样显然,不便维护,也不高效。

django提供了一套模板渲染的机制,将html源码写在模板文件中,然后通过方法将数据渲染后返回给客户端。

模板路径设置

在项目根目录下创建一个templates文件夹用来存放模板文件,然后将这个文件的路径配置到配置项TEMPLATESDIRS中。

# study_django/settings.py
...
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [str(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',],},},
]

注意要填写模板文件夹的绝对路径,通过代码str(BASE_DIR / 'templates')可以动态生成。

其实我们还有一个操作没有做,我们需要用pycharm将templates这个文件夹设置为当前项目的模板文件。设置成功之后,我们在输入html路径的时候就会有提示。

模板渲染

模板渲染本质上就是将数据替换到模板文件的插槽中,和字符串替换一样。

模板变量

最简单的渲染是将变量替换到模板中。

在模板中,模板变量的语法是:

{{ 变量名 }}

templates文件中再创建一个crm文件夹,然后在其中创建一个index.html,内容如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><p>{{ msg }}</p>
</body>
</html>

添加了一个模板变量msg,这个变量需要从视图传递一个对应的变量进行替换。修改crm.index视图如下:

# crm/views.pyfrom django.http import HttpResponse
from django.template.loader import get_templatedef index(request):msg = '我是首页面't = get_template('crm/index.html')      # 获取模板html = t.render(context={'msg': msg})   # 渲染htmlreturn HttpResponse(html)               # 返回响应

上面的代码非常简单,做了如下工作:

  1. 在视图中定义了一个变量msg
  2. 然后根据路径crm/index.html获取对应的模板,
  3. 再将变量msg传递给模板进行渲染,
  4. 最后将渲染好的html返回。

访问这个视图,返回页面如下:

上面的代码还可以通过一个快捷函数简化:

from django.shortcuts import renderdef index(request):msg = '我是首页面'return render(request, 'crm/index.html', context={'msg': msg})

render函数的第一个参数是请求request,第二个参数是模板路径,第三个参数context是要传递给模板的数据,是一个字典,其中key是模板上对应的变量名,值是实际要渲染的数据。

模板变量的解析规则

模板变量按照如下流程解析替换:

  1. 当模板引擎遇到模板变量时,它会计算该变量,并将其替换为结果
  2. 当模板引擎在变量中遇到.时(x.y的形式),它会按以下顺序尝试查找:
  3. 字典键值查找
  4. 属性或方法查找
  5. 数字索引查找
  6. 如果结果是可调用的,则调用它时不带参数。调用结果成为模板值。

模板标签

只能简单渲染变量显然不满足需求,django的模板系统中还提供了模板标签来实现更多的渲染逻辑,例如判断,循环等。

下面列出几个常用的模板标签:

for

循环浏览数组中的每个项目,使该项目可以在上下文变量中可用。例如,要显示student_list中提供的学生列表:

<ul>
{% for student in student_list %}<li>{{ student.name }}</li>
{% endfor %}
</ul>

if

{% if %} 标签会判断给定的变量,当变量为 True 时(比如存在、非空、非布尔值 False),就会输出块内的内容:

{% if student_list %}学生的数量: {{ student_list|length }}
{% else %}没有学生
{% endif %}

四、template模板相关推荐

  1. flask 模板 php,Flask四之模板

    四.模板 FMTV F:form表单 M:Model模型(数据库) T:Template模板 V:view视图(路由) 1.渲染模板 模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其 ...

  2. template模板函数

    template模板 一个简单的字符串模板 var template = (function() { var cache = {};return function(obj, str) {if (!ty ...

  3. django之template模板层-60

    django之template模板层-60 一.模板语言的变量 views.py def index(request): #模板语言的变量 name = 'Yven' addr = False age ...

  4. 设计模式之——Template模板模式

    Template模式又叫模板模式,是在父类中定义处理流程的框架,在子类中实现具体处理逻辑的模式.当父类的模板方法被调用时程序行为也会不同,但是,不论子类的具体实现如何,处理的流程都会按照父类中所定义的 ...

  5. 第六章-template模板

    第六章-template模板 文章目录 第六章-template模板 函数模板 类模板 函数模板 函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计 函数定义的 ...

  6. Ansible PLaybook template 模板详解

    template 模板 模板是一个文本文件,可以做为生成文件的模版,并且模板文件中还可嵌套jinja语法 jinja2语言 网站:https://jinja.palletsprojects.com/e ...

  7. 【小白学习C++ 教程】十五、C++ 中的template模板和泛型

    @Author:Runsen template模板在 C++ 中一个简单但非常强大的工具.简单的想法是将数据类型作为参数传递,这样我们就不需要为不同的数据类型编写相同的代码. C++ 添加了两个新关键 ...

  8. 微信小程序中template模板使用

    小程序官方使用简介 模板 WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用. 定义模板 使用 name 属性,作为模板的名字.然后在内定义代码片段,如: <! ...

  9. 最短路常用的四种模板(poj1847)

    针对于poj1847这道题,总结一下最短路常用的四种模板. ** Floyed(O(n^3)) ** #include<iostream> #include<cstdio> # ...

  10. LCA求解的四种模板

    LCA求解的四种模板 或许更好的阅读体验 树剖在线求解LCA 思想 树剖这里就不多解释了,求解LCA的过程就是轻重链的跳转,跟树剖求任意两点间的距离一样的操作,只不过不用线段树去维护disdisdis ...

最新文章

  1. MariaDB 求和,最大值,最小值,平均数
  2. android6.0源码分析之Activity启动过程
  3. vb.net2019-多线程并行计算(1)
  4. 阿里技术:万级规模K8s如何管理?
  5. UVA - 10003 - Cutting Sticks
  6. FFT:从入门到沉迷
  7. 腾讯云对象存储 python_python 云存储
  8. 什么鬼?弃用JDK动态代理,Spring5 默认使用 CGLIB 了?
  9. 华为服务器装系统怎么选pxe,华为TaiShan服务器PXE操作系统
  10. java jtextfield 不显示_【swing问题】_JTextField组件怎么显示不全啊
  11. 苹果电脑系统、xcode更新时无法完成下载问题
  12. 解决小程序背景图片在真机上不能查看的问题
  13. 【原创】FPGA开发手记(三) PS/2键盘
  14. cubeIDE开发,在LCD显示摄像头抓取的图片数据
  15. 设计模式1(策略模式)
  16. c语言未定义main报错,C语言编译器的错误信息
  17. MySQL获取当前时间的各种方式
  18. 【街道可步行性】步行通达性对街区空间活力与交往的影响 | 上海城市规划
  19. Python中文文档 目录(转载)
  20. C# WebBrowser无法跳转默认浏览器问题

热门文章

  1. 前端面试系列-CSS基础-div水平垂直居中文本居中(单行文字、多行文字)
  2. 微信小程序 单个页面横屏 整个小程序设置横屏
  3. 基于Python的算术编码的设计与实现
  4. UltraEdit软件破解方法
  5. 佳力奇IPO过会:拟募资11亿 西安现代与华控湖北是股东
  6. mysql 数据库 期末复习题库
  7. 我也来给自己定个目标
  8. 一个很Nice的Android Banner轮播图库
  9. 微信骗子 QQ7492593 电话 18627650031 这个骗子骗我4000块钱
  10. laya 阿拉丁自定义统计