模板语法

前端模板的语法只记住两种就行了。

{{ xxx }} 变量相关的
{ % % } 逻辑相关的

模板传值

我们通过后端,可以传给前端的数据,数据类型哪些能够接收,哪些不能接收?

前端基本上能接受所有后端所有的数据类型。

只要是后端能够加括号调用的,传递到html页面上都会自动加括号调用,但是如果是 函数有形参就不能调用了,html页面也不能传参。


views.py:
def test(request):
a = 1
b = 1.11
c = 'str'
d = [11,22]
e = (11,22)
s = {11,22}
f = {"user":'age'}
g = True def test1():
return 'ok' class test2(object):
def get_self(self):
return 'get_self' @classmethod
def get_cls(cls):
return 'get_cls' @staticmethod
def get_func():
return 'get_func'
obj = test2() # 我们之前是通过这种方式来给前端传值的,如果需要传的值非常的多的话,这样写就比较麻烦,
# return render(request,'test.html',{"a":a})
# 可以通过locals()这种方式,将当前所有的名称空间中的名字都传给前端。
return render(request,'test.html',locals()) test.html:
<body>
# 接收普通变量
<h1>{{ a }}</h1>
<h1>{{ b }}</h1>
<h1>{{ c }}</h1>
<h1>{{ d }}</h1>
<h1>{{ e }}</h1>
<h1>{{ f }}</h1>
<h1>{{ g }}</h1>
<h1>{{ s }}</h1> # 接收函数
<h1>{{ test1 }}</h1> # 接收类
<h1>{{ test2 }}</h1> # 接收对象
<h1>{{ obj }}</h1> # 对象.方法调用
<h1>{{ obj.get_self }}</h1>
<h1>{{ obj.get_cls }}</h1>
<h1>{{ obj.get_func }}</h1>
</body> # 打印结果:
1
1.11
str
[11, 22]
(11, 22)
{'user': 'age'}
True
{11, 22}
ok
<app01.views.test.<locals>.test2 object at 0x000000000BAD11D0>
<app01.views.test.<locals>.test2 object at 0x000000000BA9ADD8>
get_self
get_cls
get_func

过滤器

什么是过滤器?

模板语法中,提供给你了一些内置的方法,帮你快速的处理后端传过来的数据。这个是模板语法的过滤器。

过滤器 语法结构:xx|xxxx:变量 | 操作

常见的一些过滤器:

过滤器 描述
length 统计长度
add: 加法运算
slice:'' 切片操作
default: 判断是否有值,如果没有值使用默认值
filesizeformat 自动计算文件大小
truncatechars: 截取几个字符,算上...(三个点)
truncatewords: 按照空格截取几个单词,不算...(三个点)
safe 前端展示带有标签的文本

有一种后端在传递前端数据的时候,如果后端发送了一个数据是带有html标签的,是不会自动转换的,那么我们既可以使用上面自带的过滤器转义,也可以后端转移过后在发过来。

前端转义:

from django.utils.safestring import mark_safe
sss = '<h2>我是带有标签的字符串</h2>'
sss = mark_safe(sss)
return render(request,'test.html',locals())
views.py:

def test(request):
a = 1
b = 1.11
c = 'stdsdsddsdsr'
d = [11,22]
e = (11,22)
s = {11,22}
f = {"user":'age'}
g = True
is_value = ''
filesize = 3212144324
_str = 'dahsdk dsadbukab daku dasn dbda dan dwa wa dwad wawd w'
sss = '<h2>我是带有标签的字符串</h2>'
sss = mark_safe(sss)
return render(request,'test.html',locals()) test.html: <h1>
模板语法中的过滤器会自动将|左边的数据当做右边过滤器的第一个参数传进去
过滤器其实就是个函数 def length(value):
</h1>
<h1>统计c的长度:{{ c|length }}</h1> # 其实源码中就是 len(value)
<h1>加法运算:{{ a|add:10 }}</h1>
<h1>切片操作,顾头不顾尾:{{ c|slice:'0:2' }}</h1>
<h1>判断变量是否有值(有值展示值本身,没有值展示默认值):{{ is_value|default:'is_value变量名的值为空' }}</h1>
<h1>自动转大小格式:{{ filesize|filesizeformat }}</h1> # 自动转大小格式:3.0 GB
<h1>截取文本的内容(字符),截取五个字符,三个点也算:{{ c|truncatechars:5 }}</h1>
<h1>截取文本的内容(按照空格计算),截取五个字符,三个点不算:{{ c|truncatewords:5 }}</h1>
<h1>默认情况下,如果后端发送了一个数据是带有html标签的,是不会自动转换的
是因为放置恶意攻击,如果有脚本执行了就完蛋了。</h1>
<h1>展示带有标签的文本:{{ sss }}</h1>

标签

标签是一些逻辑相关的,比如for循环,if判断。

语法结构:{ % % }

伪代码例子

{% for foo in c %}
{% if forloop.first %}
<p>这是第一个值 {{ foo }}</p>
{% elif forloop.last %}
<p>这是最后一个值 {{ foo }}</p>
{% else %}
<p>{{ foo }}</p>
{% endif %}
{% empty %}
<p>当for循环的对象时空的时候会走这个</p>
{% endfor %}

如果后端传过来一些比较复杂的数据:

比如:

comp_dic = {'username': 'jason', 'hobby':
['read', 'study',
['run', 'rap', {'age': 18}]
]
} 我想要提取出年龄:
模板语法只有一种方式取值:统一采用句点符(点点点方式)
<h1>{{ comp_dic.hobby.2.2.age }}</h1>
18 那么当这个数是通过比较复杂的点点点获取到的,
后续又需要经常使用,可以给该数据起一个别名,
别名只能在with内部使用
{% with comp_dic.hobby.2.2.age as age %}
<h1>{{ age }}</h1>
{% endwith %}

自定义过滤器和标签

django支持用户自定义自己的过滤器和标签

自定义的必须要有三步准备:

  1. app名下新建一个名字必须交templatetags的文件及
  2. 在该文件夹内新建一个py文件,名字随便起
  3. 在该py文件中必须写下面两句代码
# 必须写
from django.template import Library
register = Library() # 自定义的过滤器函数
# 起个别名:bady,跟默认的过滤器一样,最多只能接收两个参数
@register.filter(name='bady')
def minus(a,b):
return a - b # 自定义标签,可以接收任意多个参数
@register.simple_tag(name='mytag')
def mytag(a,b,c,d):
return '%s ? %s ? %s ? %s ?' % (a,b,c,d,) # 自定义inclusion_tag
# inclusion_tag的作用是主页面以一定的语法给一个参数,调用某个函数,这个函数可以通过主页面给的参数做一些逻辑处理得到一些数据,将数据渲染到一个小html模块,然后将渲染后的小html模块返回给主页面渲染在调用的位置。mytag.html就是临时的一个小页面渲染
@register.inclusion_tag('mytag.html',name='myinclusion_tag')
def myinclusion_tag(n):
l = []
for i in range(n):
l.append('第%s项'%i)
return locals() mytag.html:
<ul>
{% for foo in l %}
<li>{{ foo }}</li>
{% endfor %}
</ul> 实现效果:
* 第0项
* 第1项
8 第2项
* 第3项
* 第4项
* 第5项
* 第6项
* 第7项
* 第8项
* 第9项

使用自定义的过滤器

需要先在html页面上加载

<h1>自定义过滤器的使用</h1>
{% load mytag %}
{{ 2|bady:1 }} 1
{{ 10|bady:2 }} 8 <h1>自定义标签的使用</h1>
{% load mytag %}
{% mytag '1' '2' '3' '4' %} 1 ? 2 ? 3 ? 4 ? 使用自定义的标签做逻辑判断
{% if 2|bady:2 %}
<p>{{ 2|bady:2 }}</p>
{% else %}
<p>0</p>
{% endif %} 不能不能 !!!!使用自定义的标签做逻辑判断
{% if mytag '1' '2' '3' '4' %}
<p>有值</p>
{% else %}
<p>无值</p>
{% endif %} <h1>自定义的inclusion_tag的使用
当你需要使用一些页面组件的时候,并且该页面组件需要参数才能够渲染
可以考虑使用inclusion_tag</h1>
{% load mytag %}
{% myinclusion_tag 10 %}

模板继承

当写好了一个非常漂亮的页面的时候,其他页面也需要使用这个页面,那么可以考虑使用模板的继承。

需要事先在你想要使用的页面上 划定区域 之后在继承的时候 你就可以使用你划定的区域。

也就意味着 如果你不划定任何区域 那么你将无法修改页面内容。

{% block content %}

{% endblock %}

<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
{% block content %}
{% endblock %}
</div>
</div>
</div>

html代码区域 可以设置多个block

新建的html文件就可以继承之前的模板了

{% extends 'template.html' %}

{% block content %}
{{ block.super }}
<div class="jumbotron">
<h1>Hello, world!</h1>
<p>...</p>
<p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
</div>
{% endblock %}

模板的继承

  1. 先在你想要继承的页面上通过block划定你将来可能要改的区域
  2. 在子页面上先继承extends
  3. 利用block自动提示 选择你想要修改的内容区域

模板导入

将html页面当做模块直接导入使用

{% include 'template.html' %}

Django之深入了解模板层的更多相关文章

  1. django 实战篇之模板层

    模板层 ​ {{}} 变量相关 ​ {%%} 逻辑相关 ​ 前端获取容器类型的数据统一使用 句点符(.) ​ 两种给模板传递值的方式 return render(request,'index.html ...

  2. 03_Django-GET请求和POST请求-设计模式及模板层

    03_Django-GET请求和POST请求-设计模式及模板层 视频:https://www.bilibili.com/video/BV1vK4y1o7jH 博客:https://blog.csdn. ...

  3. django学习笔记-模板层

    模板层 将Python嵌入到HTML中. 模板简介 将HTML硬解码到视图并不是那么完美原因如下: 对页面设计时也需要对python代码进行相应的修改,模板可以不就行python代码修改的情况下变更设 ...

  4. django——模板层

    每一个Web框架都需要一种很便利的方法用于动态生成HTML页面. 最常见的做法是使用模板. 模板包含所需HTML页面的静态部分,以及一些特殊的模版语法,用于将动态内容插入静态部分. 说白了,模板层就是 ...

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

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

  6. Django 的路由层 视图层 模板层

    --------------------------------------------------------------通过苦难,走向欢乐.——贝多芬 Django-2的路由层(URLconf) ...

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

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

  8. Django的模板层简介

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

  9. day 45 Django 的初识2 路由层,视图层,模板层

    前情提要: 今天继续学习Django 的内容, 今天主要和渲染相关 1>配置路由 >2:写函数 >3 指向url 一:路由层 1:配置静态支持文件 1:路由层的简单配置 >dj ...

随机推荐

  1. 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 转载 https://www.cnblogs.com/yunfeifei/p/3993401.html

    5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...

  2. Spring源码由浅入深系列三 refresh

    spring中的refresh是一个相当重要的方法.它完成IOC的第一个阶段,将xml中的bean转化为beanDefinition.详细说明如上图所示. 在上图中,创建obtainFreshBean ...

  3. vue中excal表格的导入和导出

    注意:vue中要实现表格的导入与导出,首先要install两个依赖, npm install -S file-saver xlsx  和  npm install -D script-loader.其 ...

  4. KNN 实战

    KNN算法很简单,大致的工作原理是:给定训练数据样本和标签,对于某测试的一个样本数据,选择距离其最近的k个训练样本,这k个训练样本中所属类别最多的类即为该测试样本的预测标签.简称kNN.通常k是不大于 ...

  5. 【ARC073F】Many Moves

    题目 一个显然的\(dp\),设\(dp_{i,j}\)表示其中一个棋子在\(x_i\)点,另一个棋子在\(j\)点的最小花费 显然\(dp_{i,j}\)有两种转移 第一种是把\(x_i\)上的棋子 ...

  6. Maven + Springboot + redis 配置

    前言 刚进入到Java 开发的世界,对于小白Java的我来说,使用Maven + SpringBoot 的项目下启动redis: 第一步 本地安装Redis 服务 关于redis的教程链接 点击这里: ...

  7. JAVA-基础(Stream流)

    说起stream流大家的第一反应是io,但是实际上谁规定流一定是存在io包里呢?在java8中得益于Lambda表达式的函数式编程,引入了一个全新的概念,stream. 1.优势? 在java8之前我 ...

  8. [JZOJ3337] 【NOI2013模拟】wyl8899的TLE

    题目 题目大意 给你两个字符串\(A\)和\(B\),可以修改\(A\)中的一个字符,求修改后最长的\(A\)的前缀,使它是\(B\)的子串. 思考历程 看到这道题之后,第一眼想到的就是后缀自动机! ...

  9. 边双联通分量缩点+树的直径——cf1000E

    题意理解了就很好做 题意:给一张无向图,任意取两个点s,t,s->t的路径上必经边数量为k 求这样的s,t,使得k最大 #include<bits/stdc++.h> #define ...

  10. 求1到n这n个整数间的异或值 (O(1)算法)

      问题:求1到n这n个整数间的异或值,即 1 xor 2 xor 3 ... xor n 记 f(x, y) 为x到y的所有整数的异或值. 对 f(2^k, 2^(k+1) -1) (注意文章中的  ...