在一个项目里面有一个专门放模板的文件夹Templates,有一个专门放视图的文件views,而且我们大多给浏览器响应的都应该是一个完整的页面,也就是读取的是一个HTML文件,然后再返回给浏览器。但我们在写HTML文件时,里面关于要从数据库拿数据,或者经常更改的地方又不能写死了,此时就需要用到模板语法了,在HTML文件中写上模板语法,然后在views读取HTML文件时,再对HTML文件中模板语法进行解析,替换。这样即完成解耦,又实现代码的复用性。

  一、模板语法中的变量

  Templates中的HTML文件::

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>{{ content }}</p>
<p>{{ l1.0 }}</p>
<p>{{ l1.1 }}</p>
<p>{{ d1.name }}</p>
<p>{{ d1.age }}</p>
<p>{{ p1.id }}</p>
<p>{{ p1.hobby }}</p>
  <p>{{p1.func}}</p>
</body>
</html>

  views.py文件:

def test(request):
l1=[1,2,4,6]
d1={'name':'hh','age':20}
content='你好啊,你在哪'
class Person(object):
def __init__(self,id,hobby):
self.id=id
self.hobby=hobby
     def func(self):
       return 111
p1=Person('xx',30)
return render(request,'test.html',{'content':content,'l1':l1,'d1':d1,'p1':p1})

  对于变量来说,我们用句点符‘.’,就可以拿到值。引用对象的方法时,拿到的是方法的返回值。

  二、模板中的过滤器

<p>{{ value|default:'nothing' }}</p>
默认值过滤器,当value有值时,就用它自己的值,但当value为False或空时,就用默认值‘nothing’
<p>{{ value|length }}</p>
返回的是值的长度,字符串、列表可以用,返回数据长度
<p>{{ value|filesizeformat }}</p>
返回的是一个很容易读的文件大小,比如文件为123456789字节,输出会是117.7MB
<p>{{ value|date:'Y-m-d' }}</p>
如果value=datetime.datetime.now(),返回的是年月日
<p>{{ value|slice:'2:5' }}</p>
如果value=‘qwertyu’,返回的就是erty
<p>{{ value|truncatechars:9 }}</p>
如果字符串长度大于截断量,就会被截断,截断的字符串将以‘...’结尾,所以实际看到的字符要少三个
<p>{{ value|truncatewords:3 }}</p>
这也是截断,但这是按单词数来截断
<p>{{ value|safe }}</p>
value=‘<a href=''>点击</a>’,如果没有safe,会把标签转义,比如‘<’转义为'&gl;',在浏览器上看到也不是‘<’,而是'&gl;',但这样破坏了我想要的形式
但当加上safe之后,他就会原样输出

  三、模板中的标签

  1,for标签,就是遍历每一个元素

{% for item in l1 %}
<p>{{ item }}</p>
{% endfor %}
会遍历l1列表中的每一个元素,然后再放进p标签中
{% for foo in l1 reversed %}这样就可以反向遍历了
{% for k,v in d1.items %}
<p>{{ k }}:{{ v }}</p>
{% endfor %}
这样就可以循环拿到字典中的key和value
{% for item in l1 %}
<p>{{ item }}</p>
<p>{{ forloop.counter }}</p> 得到循环序号,从1开始
<p>{{ forloop.counter0 }}</p> 得到循环序号,从0开始
<p>{{ forloop.revcounter }}</p> 得到循环序号,比如数据长度为5,就从5开始,降序,最后一个为1
<p>{{ forloop.revcounter0 }}</p> 得到循环序号,比如数据长度为5,就从4开始,降序,最后一个为0
<p>{{ forloop.first }}</p> 得到第一个序号
<p>{{ forloop.last }}</p> 得到最后一个序号
{% endfor %}
{% for k,v in d1.items %}
<p>{{ k }}:{{ v }}</p>
{% empty %}
<p>没有这个字典,或者字典为空</p>
{% endfor %}
empty的作用就是,当你循环列表或字典时,没有找到或为空时,就返回empty中的内容

  2,if标签,做判断使用

{% if num > 100 %}
<p>大于100</p>
{% elif num > 50 and num < 100 %}
<p>大于50,小于100</p>
{% else %}
<p>小于50</p>
{% endif %}

  3,with标签

{% with hobby=p1.hobby %}
<p>{{ hobby }}</p>
{% endwith %}
相当于给一个复杂的东西取个别名,之后用别名就行了

  4,csrf_token,用于跨站请求伪造保护

<form action="{% url 'log' %}" method="post">
{% csrf_token %}
姓名 <input type="text" name="user">
密码 <input type="password" name="pwd">
<input type="submit">
</form>
</body>
我们之前在以post请求方式提交表单,必须在环境变量中修改设置,这是一种方法,但你这一该,以后所有的post请求都可以提交了,但我不想让所有的都可以提交,只让这一个提交咋办呢
此时我们就不要把环境变量中修改了,只需在form表单里写上{% csrf_token %}就行了

  四、自定义标签和过滤器

  1,在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的标签和过滤器,但一般在创建app时,django会自动帮你配置,就不用自己去配置

  2,在app中创建templatetags模块(模块名只能是templatetags)

  3,创建py文件,如:my_tags.py

from django import template
register=template.library()
@register.filter
def filter_multi(v1,v2):
return v1*v2
@register.simple_tag
def simple_tag_multi(v1,v2):
return v1*v2

  4,在使用使用自定义的之前要导入创建的my_tags.py

{% load my_tags %}

  5,使用自定义的

{{ num|filter_multi:3 }}
后面只能跟一个参数,可以跟上一个列表,所以在定义时,也只能定义两个参数
{% simple_tag_multi 2 3 %}
可以跟上任意个参数,以空格隔开就行,所以在定义时可以定义多个参数

  五、继承

  我们在浏览网页时,会发现很多网页的大体都一样,比如电影天堂,你点进每个电影的页面时,除了没得电影的内容不一样之外,其他都一样,对于这种情况,我们是不需要每个电影都要完整的写HTML标签,可以先写一个样板,把不一样的地方,或者需要变化的地方写成block,然后在每个电影的HTML文件中再具体在block进行修改就行了,而且每个电影的HTML只需要学变化的地方就行,其他的继承样板的就行。

样板:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}
title
{% endblock %}</title>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous"> <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
<style>
*{
margin: 0;
padding: 0;
}
.head{
width: 100%;
height: 50px;
background-color: indigo;
color: white;
font-size: 30px;
line-height: 50px;
}
</style>
</head>
<body>
<div class="head">爱读书欢迎你</div>
<div>
<div class="left col-md-2">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">菜单</h3>
</div>
<div class="panel-body">
<p><a href="{% url 'shouye' %}">首页</a></p>
<p><a href="{% url 'wenxue' %}">文学</a></p>
<p><a href="{% url 'shige' %}">诗歌</a></p>
<p><a href="{% url 'xiaoshuo' %}">小说</a></p>
</div>
</div>
</div>
<div class="right col-md-10">
{% block content1 %}
<div class="container">
<table class="table table-bordered">
<thead>
<tr>
<th>编号</th>
<th>名字</th>
<th>价格</th>
<th>出版社</th>
<th>作者</th>
</tr>
</thead>
<tbody id="tbody">
{% block content %}
{% endblock %}
</tbody>
</table>
</div>
{% endblock %}
</div>
</div>
</body>
</html>

模板一:这就是一个HTML文件,交给render()就可以响应到浏览器

{% extends 'model.html' %}     这相当于是把样板的内容复制过来,这必须写在第一句
{% block title %} 这相当于要把样板中block title给替换掉
诗歌
{% endblock %}
{% block content %}
{% for shige in shige_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ shige.name }}</td>
<td>{{ shige.price }}</td>
<td>{{ shige.printer }}</td>
<td>{{ shige.author }}</td>
</tr>
{% endfor %}
{% endblock content %} 其中的content可以去掉,加上只是为了让人更加清楚看出结束是那个block

模板二:

{% extends 'model.html' %}
{% block title %}
文学
{% endblock %}
{% block content %}
{% for wenxue in wenxue_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ wenxue.name }}</td>
<td>{{ wenxue.price }}</td>
<td>{{ wenxue.printer }}</td>
<td>{{ wenxue.author }}</td>
</tr>
{% endfor %}
{% endblock %}

Django之模板层的更多相关文章

  1. python 全栈开发,Day69(Django的视图层,Django的模板层)

    昨日内容回顾 相关命令: 1 创建项目 django-admin startproject 项目名称 2 创建应用 python manage.py startapp app名称 3 启动项目 pyt ...

  2. Django的模板层简介

    Django的模板层 如果我们想要利用视图函数返回一个页面,一种比较简单的方式是利用HttpResponse()方法返回一个含有html内容的字符串: def current_datetime(req ...

  3. 04-01 Django之模板层

    Django之模板层 一 模板简介 在刚刚介绍完的视图层中我们提到,浏览器发送的请求信息会转发给视图函数进行处理,而视图函数在经过一系列处理后必须要有返回信息给浏览器.如果我们要返回html标签.cs ...

  4. Django框架-模板层

    Django框架-模板层 一.模板语法传值 1.验证是否python所有的数据类型都可以传递到前端 locals()的妙用:该方法虽然好用,但是在某些情况下会造成资源的浪费 结论:整型.浮点型.字符串 ...

  5. Django之模板层细说

    django的模板层,基于我们前面学习的内容,也知道主要语法是{{变量相关}}{%逻辑相关%},那么具体还有哪些内容呢?且听我娓娓道来. 模板层(模板语法) 标签 过滤器 自定义标签,过滤器,incl ...

  6. Django基础模板层(75-76)

    Django框架之模板层(d75)一 模版语法之变量: ** locals() 会把*该*视图函数内的变量,传到模板    ** return render(request, 'index.html' ...

  7. Django基础——模板层(template) (Day67)

    阅读目录 变量 标签 自定义过滤器和标签 模板层(template) 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. 1 2 3 4 ...

  8. 5、Django之模板层

    一 模板简介 在刚刚介绍完的视图层中我们提到,浏览器发送的请求信息会转发给视图函数进行处理,而视图函数在经过一系列处理后必须要有返回信息给浏览器.如果我们要返回html标签.css等数据给浏览器进行渲 ...

  9. 053.Python前端Django框架模板层

    模板层 一 模板语法之变量 在 Django 模板中遍历复杂数据结构的关键是句点字符, 语法: {{ var_name }} [root@node10 mysite]# cat app01/urls. ...

  10. Django的模板层

    一 模版简介 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now ...

随机推荐

  1. Myeclipse中的tomcat项目的内存溢出

    tomcat中 内存溢出 在这里写上 -Xmx1024M -Xms1024M -XX:NewSize=128m -XX:MaxNewSize=128m -XX:PermSize=128m -XX:Ma ...

  2. Chapter3_操作符_关系操作符

    java中的关系操作符有等于“=”,不等于“!=”,大于“>”,小于“<”,大于等于“≥”,小于等于“≤”等.这些都不再赘述了,有一个有意思的点是关于等价性的讨论. 在java中测试两个对 ...

  3. 卓豪ManageEngine参加2018企业数字化转型与CIO职业发展高峰论坛

    卓豪ManageEngine参加2018企业数字化转型与CIO职业发展高峰论坛 2018年10月20日,78CIO APP在北京龙城温德姆酒店主办了主题为“新模式.新动能.新发展”的<2018企 ...

  4. 如何将他人的SOPC工程转换为自己可以使用的工程

    上篇文章的程序源码在:http://download.csdn.net/detail/noticeable/9921952 源码错误现象: 在下载源码文件解压后,打开系统工程,可以看到quartus ...

  5. linux、centos下安装配置vim

    ---恢复内容开始--- 1.一般情况下安装上centos后,会有vi,没有vim(以后可能会有吧) 如果不确定自己有没有vim,使用命令 rpm -qa|grep vim 查看,如果有的话,会显示三 ...

  6. Buffer cache hit ratio性能计数器真的可以作为SQL Server 内存瓶颈的判断指标吗?

    SQL Server中对于Buffer cache hit ratio的理解: Buffer cache hit ratio官方是这么解释的:“指示在缓冲区高速缓存中找到而不需要从磁盘中读取的页的百分 ...

  7. [算法专题] BST&AVL&RB-Tree

    BST 以下BST的定义来自于Wikipedia: Binary Search Tree, is a node-based binary tree data structure which has t ...

  8. 【leetcode】 算法题2 两数相加

      问题      给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例 ...

  9. WITH RECOMPILE和OPTION(RECOMPILE)区别

    在考虑重编译T-SQL(或者存储过程)的时候,有两种方式可以实现强制重编译(前提是忽略导致重编译的其他因素的情况下,比如重建索引,更新统计信息等等), 一是基于WITH RECOMPILE的存储过程级 ...

  10. cad2013卸载/安装失败/如何彻底卸载清除干净cad2013注册表和文件的方法

    cad2013提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装cad2013失败提示cad2013安装未完成,某些产品无法安装,也有时候想重新安装cad2013 ...