变量的使用
{{ }}:变量相关
{% %}:逻辑相关
def test(request): num =1 s = 'hello' li = [1,2,['a','b']] dic = {'name':'zyl','password':'123'} tup = (1,2,3,4) se = {1,2,3} def my_test(): return '你是猪' class test1: def __init__(self,name): self.name=name @classmethod def classM(cls): return '我是类方法' @staticmethod def staM(): return '我是静态方法' def get_name(self): return self.name def __str__(self): return '大帅比' t=test1('zyl') return render(request,'test.html',locals())
后端朝前端页面传递数据的方式
第一种
return render(request,'index.html',{'n':n})
第二种
return render(request,'index.html',locals())
在views中定义上面的函数,locals()是将当前所在的名称空间中的名字全部传递给前端页面
后端传函数名到前端,会自动加括号调用,但是不支持传参,后端传对象到前端,就相当于打印了这个对象
上图传入的变量有:整型,字符串,列表,字典,集合,元组,无参函数,类的对象
前端test.html
<h1>day57</h1> <p>数字:{{ num }}</p> <p>字符串{{ s }}</p> <p>列表:{{ li }}</p> <p>字典:{{ dic }}</p> <p>元组:{{ tup }}</p> <p>集合:{{ se }}</p> <p>函数:{{ my_test }}</p> <p>对象:{{ t }}</p> #得到的结果是一个内存地址,可以用__str__修改 <p>对象属性:{{ t.name }}</p> <p>对象函数:{{ t.get_name}}</p> <p>类函数:{{ t.classM}}</p> <p>全局函数:{{ t.staM}}</p>
前端获取后端传过来的容器类型的内部元素 统一采用句点符(.)
{{ li }},{{ li.1 }} 数字对应的就是数据的索引
模板中支持的写法:
注意:传进来的函数一定不能是含参函数
模板语法的注释
不会展示到前端页面
原生html的注释
会展示到前端
Filter(过滤器)
语法:{{value|filter_name:参数}}
'|'左右没有空格!
过滤器会把左边的值当做一个个参数传给右边的过滤器,过滤器后面的值会当做第二个参数传递给过滤器
常用过滤器:
1、default:
{{ flag|default: "没东西"}}
如果value没有值就限时‘没东西’
2、leagth:
{{ li|length }}
返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.
3、filesizeformat
将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB'
, '4.1 MB'
, '102 bytes'
, 等等)
{{ file_size|filesizeformat }}
4、slice
从索引为0切到索引为4,不保留4,前闭后开,后面的参数可以为负数
5、date
格式化(不加%号)
from datetime import datetime ctime = datetime.now()
6、truncatechars
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
参数:截断的字符数
{{ s|truncatechars:7}}
其中...也计算在内
7、truncatewords
和truncatechars不同,这是按照空格的数量截断的,同样的。截断的字符串将以可翻译的省略号序列(“...”)结尾。
参数:截断的字符数
{{ s|truncatewords:3}}
其中...不算3个字符位置
8、safe(********)
Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。
前端取消转义
{{ h1|safe}}
后端取消转义
from django.utils.safestring import mark_safe h1=mark_safe('<h1>我就是我</h1>')
9、add
num作为第一个参数,2作为第二个参数相加 如果两个都是数字的话就相加,如果其中有一个是字符串的话结果为‘ ’空
如果两个参数都是字符串,执行字符串相加
标签
for循环
{% for foo in l %} {# l = [1,2,3,4,5,6,7] #} <p>{{ foo }}</p>
{% endfor %}
结果:
{% for foo in l %} {# l = [1,2,3,4,5,6,7] #} {# <p>{{ foo }}</p>#} <p>{{ forloop }}</p>
{% endfor %}
结果:
这是一个自定义对象 first,last标识当前for循环是第一次还是最后一次,如果是返回True,否则False
count0:类似索引,后端枚举enumerate,
if判断
% if l %} <p>这个l有值</p> {% else %} <p>这个l没值</p> {% endif %}
嵌套使用
% for foo in l %} {# l = [1,2,3,4,5,6,7] #} {% if forloop.first %} <p>这是我的第一次</p> {% elif forloop.last%} <p>最后一次</p> {% else %} <p>继续嗨</p> {% endif %}
结果:
empty
当你的for循环对象为空的时候会自动走empty代码块儿的内容
后端:
l = None
前端
{% for foo in l %} {# l = [1,2,3,4,5,6,7] #} {% if forloop.first %} <p>这是我的第一次</p> {% elif forloop.last%} <p>最后一次</p> {% else %} <p>继续嗨</p> {% endif %} {% empty %} <p>你给我的l为空不能for循环</p> {% endfor %}
字典for循环
{% for foo in dic %} {# l = [1,2,3,4,5,6,7] #} {{ foo }} {% endfor %} <p>一</p> {% for foo in dic.keys %} {{ foo }} {% endfor %} <p>二</p> {% for foo in dic.values %} {{ foo }} {% endfor %} <p>三</p> {% for foo in dic.hobby.0 %} {{ foo }} {% endfor %} <p>四</p> {% for foo in dic.items %} {{ foo }} {% endfor %}
结果:
模板with用法
% with dic.hobby.2 as h %} {{ h }} {% endwith %} {{ dic.hobby.2 }}
给复杂获取值得代码重命名,方便下次使用
注:重命名的变量只能在with里面使用
自定义过滤器
必须做的三件事
1.在应用名下新建一个名为templatetags文件夹(必须叫这个名字) 2.在该新建的文件夹内新建一个任意名称的py文件 3.在该py文件中需要固定写下面两句代码 from django import template register = template.Library()
自定义过滤器
@register.filter(name='baby') def mu_sum(a,b): return a+b
使用方法
{% load my_tag %} {{ xxx|baby:10 }} {# xxx+10 #}
自定义标签
@register.simple_tag(name='plus') def plus(a,b,c): return '%s-%s-%s'%(a,b,c )
使用方法
{% load my_tag %} {{ xxx|baby:10 }} {# xxx+10 #} {% plus xxx 'egon' 'zyl' %}
注意:自定义的过滤器可以在if和for中使用,但是自定义的标签不能使用
自定义inclusion_tag
调用自定义的inclusion_tag能够返回一段html代码、
@register.inclusion_tag('login.html',name='login') def login(n): # l = [] # for i in range(n): # l.append('第%s项'%i) l = [ '第%s项'%i for i in range(n)] return {'l':l}
# login.html <ul> {% for foo in l %} <li>{{ foo }}</li> {% endfor %} </ul>
# 调用 {% login 5 %}
结果:
注意 :要想使用自定义的过滤器 标签 inclusion_tag 必须先在需要使用的html页面加载你的py文件
模板的继承与导入
首先需要在被继承的模板中划分多个区域
{% block 给区域起的名字 %}
{% endblock %}
通常情况下一个模板中应该至少有三块
{% block css %} 页面css代码块 {% endblock %} {% block js %} 页面js代码块 {% endblock %} {% block content %} 页面主体内容 {% endblock %}
子板继承模板
先继承模板所有的内容 {% extends 'home.html' %} 然后根据block块的名字修改指定区域的内容 {% block content %} <h1>登录页面</h1> <form action=""> <p>username:<input type="text" class="form-control"></p> <p>password:<input type="text" class="form-control"></p> <input type="submit" class="btn btn-success"> </form> {% endblock %}
模板的导入:将一段html当做模块的方式导入到另一个html展示
{% include '想导入的html文件名' %}
静态文件配置
{% load static %} <link rel='stylesheet' href="{% static 'css/mycss.css'%}"> # 第一种方式 <link rel='stylesheet' href="{% get_static_prefix %}css/mycss.css"> # 第二种方式