1.模板语言之变量
def index(request): name='lqz' age=18 ll=['name','age'] dic={'name':name,'age':age} class A: school='oldboy' obj=A() def test(): print(11) ' return render(request,'index.html',locals())
{{ 变量 }}:相当于print了该变量
在html中,如果变量是函数的话,则会执行函数,然后打印执行结果
注意:模板语言中,不支持函数带参数的用法
深度查询,统一都用句点符。只要能取到值,可以一直点下去。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>模板语言之变量</h1> <p>{{ name }}</p> <p>{{ age }}</p> <p>{{ ll }}</p> <p>{{ ll.0 }}</p> <p>{{ dic }}</p> <p>{{ dio.name }}</p> <p>{{ A }}</p> <p>{{ obj }}</p> <p>{{ test }}</p> </body> </html>
模板不支持函数带参数。支持字符串自带的函数功能,不能传参,使用时直接点即可
name.upper
2.模板语言之过滤器
过滤器其实可以理解成内置的功能函数
过滤器的传参形式是:{{ ‘lqz’|add '+nb' }}
过滤器好像一定要传两个参数?
不用safe,则不会解析语句,使用safe后会进行解析语句。所以safe要谨慎使用。
date只支持datetime的转换
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>模板语言之变量</h1> <p>{{ name }}</p> <p>{{ age }}</p> <p>{{ ll }}</p> <p>{{ ll.0 }}</p> <p>{{ dic }}</p> <p>{{ dio.name }}</p> <p>{{ A }}</p> <p>{{ obj }}</p> <p>{{ test }}</p> <hr> <h1>模板语言之过滤器</h1> {#语法:{{ 第一个参数|过滤器名字:第二个参数 }},最多支持两个参数#} {#常用过滤器#} <p>统计字符串的长度:{{ name|length }}</p> <p>统计列表的长度:{{ ll|length }}</p> {#如果第一个参数值是false或者为空,使用给定的默认值,否则,使用变量的值#} <p>过滤器之默认值:{{ ll2|default:'lqz' }}</p> {#时间格式#} <p>过滤器之date:{{ ctime|date:'Y-m-d' }}</p> {#slice切割,区间前闭后开#} <p>{{ ll|slice:'2:-1' }}</p> {#truncatechars截断字符#} <p>过滤器之truncatechars:{{ 'hnjskladjasl'|truncatechars:5 }}</p> {#truncatecwords截断单词#} <p>过滤器之truncatewords:{{ 'hello world nihao good help god '|truncatechars:5 }}</p> {#过滤器之使用safe,会解析script语句,然后执行#} <p>过滤器之用safe:{{ h1|safe }}</p> {#过滤器之不用safe,不会解析script语句,所见即所得#} <p>过滤器之不用safe:{{ h1 }}</p> </body> </html>
3.模板语言之标签
标签的传参形式是后面加引号括起来:{% add2 'xuxu' %}
forloop只能在for循环中使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>模板语言之变量</h1> <p>{{ name }}</p> <p>{{ age }}</p> <p>{{ ll }}</p> <p>{{ ll.0 }}</p> <p>{{ dic }}</p> <p>{{ dio.name }}</p> <p>{{ A }}</p> <p>{{ obj }}</p> <p>{{ test }}</p> <hr> <h1>模板语言之过滤器</h1> {#语法:{{ 第一个参数|过滤器名字:第二个参数 }},最多支持两个参数#} {#常用过滤器#} <p>统计字符串的长度:{{ name|length }}</p> <p>统计列表的长度:{{ ll|length }}</p> {#如果第一个参数值是false或者为空,使用给定的默认值,否则,使用变量的值#} <p>过滤器之默认值:{{ ll2|default:'lqz' }}</p> {#时间格式#} <p>过滤器之date:{{ ctime|date:'Y-m-d' }}</p> {#slice切割,区间前闭后开#} <p>{{ ll|slice:'2:-1' }}</p> {#truncatechars截断字符#} <p>过滤器之truncatechars:{{ 'hnjskladjasl'|truncatechars:5 }}</p> {#truncatecwords截断单词#} <p>过滤器之truncatewords:{{ 'hello world nihao good help god '|truncatechars:5 }}</p> {#过滤器之使用safe,会解析script语句,然后执行#} {#<p>过滤器之用safe:{{ h1|safe }}</p>#} {#过滤器之不用safe,不会解析script语句,所见即所得#} <p>过滤器之不用safe:{{ h1 }}</p> <hr> <h1>模板语言之标签</h1> {#{% for i in ll %}#} {# 取出外层第几次循环#} {# {% for person in person_list %}#} {# {{ forloop.parentloop.counter }}#} {# <p>{{ person }}</p>#} {# {% endfor %}#} {#{% endfor %}#} {#循环的对象是空,才会走到empty#} {#{% for foo in ll2 %}#} {# <p>{{ foo }}</p>#} {#{% empty %}#} {# 傻屌#} {#{% endfor %}#} {#循环的是字典的value值#} {#{% for v in dic.values %}#} {# <p>{{ v }}</p>#} {#{% endfor %}#} {#循环的是字典的key:value值#} {#{% for k,v in dic.items %}#} {# <p>{{ k }}:{{ v }}</p>#} {#{% endfor %}#} {#{% if user %}#} {# <a href="">退出</a>#} {# {% else %}#} {# <a href="">登录</a>#} {# <a href="">注销</a>#} {#{% endif %}#} {#{% for l in ll %}#} {# {% if forloop.first %}#} {# <p>第一次的我</p>#} {# {% elif forloop.last %}#} {# <p>最后一次的我</p>#} {# {% else %}#} {# <p>{{ l }}</p>#} {# {% endif %}#} {#{% endfor %}#} {#with相当于取别名,当变量名很长时,可以使用该方法#} {% with user as ttt %} <p>{{ user }}</p> {% endwith %} </body> </html>
4.自定义标签过滤器
如果程序报错的话,重启一下django
在app里创建templatetags模块(模块名只能是templatetags)
在templatetags模块里创建任意一个py文件,例如mytag.py,在mytag.py中代码如下
from django.template import Library from django.utils.safestring import mark_safe register=Library() #register不能改名,只能用这个名字 #自定义过滤器 @register.filter()#name相当于别名,一般不写.is_safe一般不写,写了后模板会解析执行语句 def str_add(str1,str2): return str1+str2 #自定义标签 @register.simple_tag()# def add_nb(str): return str+'nb' @register.simple_tag(name='yyy') def add_3(str1,str2,str3): return str1+str2+str3
在templates中的html文件中代码如下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>模板语言之变量</h1> <p>{{ name }}</p> <p>{{ age }}</p> <p>{{ ll }}</p> <p>{{ ll.0 }}</p> <p>{{ dic }}</p> <p>{{ dio.name }}</p> <p>{{ A }}</p> <p>{{ obj }}</p> <p>{{ test }}</p> <hr> <h1>模板语言之过滤器</h1> {#语法:{{ 第一个参数|过滤器名字:第二个参数 }},最多支持两个参数#} {#常用过滤器#} <p>统计字符串的长度:{{ name|length }}</p> <p>统计列表的长度:{{ ll|length }}</p> {#如果第一个参数值是false或者为空,使用给定的默认值,否则,使用变量的值#} <p>过滤器之默认值:{{ ll2|default:'lqz' }}</p> {#时间格式#} <p>过滤器之date:{{ ctime|date:'Y-m-d' }}</p> {#slice切割,区间前闭后开#} <p>{{ ll|slice:'2:-1' }}</p> {#truncatechars截断字符#} <p>过滤器之truncatechars:{{ 'hnjskladjasl'|truncatechars:5 }}</p> {#truncatecwords截断单词#} <p>过滤器之truncatewords:{{ 'hello world nihao good help god '|truncatechars:5 }}</p> {#过滤器之使用safe,会解析script语句,然后执行#} {#<p>过滤器之用safe:{{ h1|safe }}</p>#} {#过滤器之不用safe,不会解析script语句,所见即所得#} <p>过滤器之不用safe:{{ h1 }}</p> <hr> <h1>模板语言之标签</h1> {#{% for i in ll %}#} {# 取出外层第几次循环#} {# {% for person in person_list %}#} {# {{ forloop.parentloop.counter }}#} {# <p>{{ person }}</p>#} {# {% endfor %}#} {#{% endfor %}#} {#循环的对象是空,才会走到empty#} {#{% for foo in ll2 %}#} {# <p>{{ foo }}</p>#} {#{% empty %}#} {# 傻屌#} {#{% endfor %}#} {#循环的是字典的value值#} {#{% for v in dic.values %}#} {# <p>{{ v }}</p>#} {#{% endfor %}#} {#循环的是字典的key:value值#} {#{% for k,v in dic.items %}#} {# <p>{{ k }}:{{ v }}</p>#} {#{% endfor %}#} {#{% if user %}#} {# <a href="">退出</a>#} {# {% else %}#} {# <a href="">登录</a>#} {# <a href="">注销</a>#} {#{% endif %}#} {#{% for l in ll %}#} {# {% if forloop.first %}#} {# <p>第一次的我</p>#} {# {% elif forloop.last %}#} {# <p>最后一次的我</p>#} {# {% else %}#} {# <p>{{ l }}</p>#} {# {% endif %}#} {#{% endfor %}#} {#with相当于取别名,当变量名很长时,可以使用该方法#} {% with user as ttt %} <p>{{ user }}</p> {% endwith %} <hr> <h1>自定义标签过滤器</h1> <h4>使用自定义的过滤器</h4> {% load mytag %} <p>{{ 'lqz'|str_add:'nb' }}</p> <h4>使用自定义的标签</h4> {#有参数的直接在后面传参#} <p>{% add_nb 'egon' %}</p> <p>{% yyy 'alex' 'is' 'dsb' %}</p> {#过滤器可以用于if判断,但是标签不行#} {% if 'lqz'|str_add:'nb' %} <p>肯定是True</p> {% endif %} {#标签用于if判断,直接报错#} {#{% if add_nb 'egon' %}#} {#<p>是真吗?</p>#} {#{% endif %}#} </body> </html>
5.模板的导入
这是为了复用代码,提升开发效率。比如写了一个左侧样式,比较喜欢,想一直用,这样可以把样式存在left.html中
<div> <div class="panel panel-default"> <div class="panel-heading">重金求子</div> <div class="panel-body"> 诱人少妇 </div> </div> <div class="panel panel-default"> <div class="panel-heading">澳门赌场</div> <div class="panel-body"> 在线发胖 </div> </div> </div>
这样,在test.html复用左侧样式时,
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css"> <title>Title</title> <style> .head { height: 60px; background: #2e6da4; } </style> </head> <body> <div class="head"></div> <div class="container-fluid"> <div class="row"> <div class="col-md-2"> {% include 'left.html' %} </div> <div class="col-md-9"></div> </div> </div> </body> </html>
主要是使用include,其实就是一句话,{% include ‘left.html’ %}
导入其实就是将一些会复用到的html代码保存到一个html文件中比如left.html中,复用时在其他html文件中include一下。
导入与继承的区别,导入是只是复用一部分样式,其他的是手写。而继承有母版,是复用整体样式,修改部分内容。
6.模板的继承
写一个母版,留一个可扩展的区域(盒子),可以留多个盒子(留的越多,可扩展性越高)
注意,所有的一切代码都要放在endblock之前,也就是盒子里面。每个盒子只能出现一次
使用{% extends ‘’base.html %}
如果要继承模板的内容,可以
{% block content1 %}
{{ block.super }}
{% endblock content1 %}
如果继承了多个盒子,在子版中,盒子的先后摆放顺序并不影响显示顺序。就像函数的查找过程一样,block content1,block content2在母版中已经定义好了
母版代码如下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css"> <title>Title</title> <style> .head { height: 60px; background: #2e6da4; } </style> </head> <body> <div class="head"></div> <div class="container-fluid"> <div class="row"> <div class="col-md-2"> {% include 'left.html' %} </div> <div class="col-md-9"> {% block content1 %} <p>这是自定义区域</p> {% endblock content1 %} {% block content2 %} <p>你养我啊</p> <p>我养你啊</p> <p>你还是先养你自己吧,傻瓜</p> {% endblock content2 %} </div> </div> </div> </body> </html>
导入的html代码如下
{% extends 'base.html' %} {% block content1 %} {# {{ block.super }}#} <p>麻麻辣辣骨头汤</p> <p>稀松平常干拌面</p> {% block content2 %} {{ block.super }} {% endblock content2 %} {% endblock content1 %}
7.静态文件配置
有3种静态文件配置方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> 静态文件配置的三种方式 方式1:写死static <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css"> 方式2:load static {% load static %} <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.css' %}"> 方式3:load static {% load static %} <link rel="stylesheet" href="{% get_static_prefix %}bootstrap-3.3.7-dist/css/bootstrap.css"> <title>Title</title> </head> <body> <h1>测试</h1> </body> </html>
注意:导入jquery要先于导入bootstrap,因为bootstrap是需要jquery的支持的。
<script src="/static/jquery-3.3.1.js"></script>
8.设置当其他路由都不匹配时,返回404页面
url(r'',views.error)
9.inclusion_tag
多用于返回html的代码
先注册app
在app下创建一个templatetags的模块
在模块下新建一个py文件
from django.template import Library
register=Library() 名字必须叫register
使用装饰器:@register.inclusion_tag('test.html')
前端代码
<ul> {% for s in ss %} <li>{{ s }}</li> {% endfor %} </ul>
后台代码
from django.template import Library register=Library() @register.inclusion_tag('test.html') def my_inclussion(key): ll=['第%s页'%i for i in range(key)] return {'ss':ll}
其实就相当于把动态html代码存进了自定义的函数中,然后用装饰器@register.inclusion_tag进行了装饰
使用。{% load mytag %}
{% my_inclusssion 10 %}
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css"> <title>Title</title> </head> <body> <div class="container-fluid"> <div class="row"> <div class="col-md-6 col-md-offset-3"> {% load mytag %} {% my_inclussion 10 %} </div> </div> </div> </body> </html>