模板

之前的案例中,能够返回简单的字符串信息给浏览器。那如果想要返回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. NCBI SRA数据库使用详解
  2. 手机上图片信息怎么拉一个矩形框_跟着黑鲨手机发布会学习PPT制作
  3. android webview底部黑条,去掉UIWebView底部的黑条
  4. mysql 服务器初始面膜_安全初始化MySql服务器
  5. 你真的了解Java中的三目运算符吗
  6. 最近项目中遇到的问题以及解决办法
  7. python上下文管理关键字_理解 Python 的上下文管理器
  8. 计算机网络专业学python_「非计算机专业」小白如何学好Python?
  9. 将 php 转换/编译为 EXE
  10. LiveNVR传统安防摄像机互联网直播-主要功能模块及相关技术特点与性能指标
  11. 基于Java毕业设计移动电商网站源码+系统+mysql+lw文档+部署软件
  12. 注册Flash8.ocx控件
  13. 腾讯云函数转华为云函数
  14. java seek_java中seek()的用法
  15. http请求 405错误 方法不被允许 (Method not allowed)
  16. 若依后台实现表连接查询显示,一对一查询
  17. adb和frida的一点简单使用记录
  18. 哲理故事与管理之道(21)-用情感激励下属
  19. 改springboot项目遇到的@Restcontroller返回网页问题
  20. php实现关键字搜索,php关键字搜索

热门文章

  1. h5页面转PDF下载(包括pc端和移动端)
  2. 靶机渗透练习41-Empire Lupin One
  3. 视频捕获:预览、截图、录像(MP4 软/硬编码)、推流,一网打尽
  4. 重大里程碑!VOLO屠榜CV任务,无需额外数据,首个超越87%的模型
  5. nice-learning
  6. flume采集hive日志写到hdfs问题
  7. 快速去除图标斜线水印
  8. 快速建立里自己的kindle书库,并实现远程访问
  9. 记录token的作用
  10. DIY TCP/IP IP模块和ICMP模块的实现2