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>

最新文章

  1. java如何在eclipse编译时自动生成代码
  2. SQL的inner join、left join、right join、full outer join、union、union all
  3. C#泛型接口
  4. html5 shiv
  5. python系统编码格式
  6. 用于 Visual Studio 和 ASP.NET 的 Web 应用程序项目部署常见问题
  7. 调用百度地图API实现手机自动定位 (逆地址解析)
  8. 本地/远程Service 和Activity 的交方式(转)
  9. KMP 知识点总结
  10. linux部署solr服务--小记
  11. freemarker自定义标签报错(四)
  12. 20165319 《JAVA程序设计》第一周学习总结
  13. GLSL数组类型、浮点数Uniform
  14. 《Linux内核设计与实现》读书笔记 1&amp;2
  15. tensorflow模型在实际上线进行预测的时候,使用CPU工作
  16. Hive文件存储格式和hive数据压缩
  17. PHP 5.5以上 使用 CURL 上传文件
  18. [pixhawk笔记]5-uORB消息传递
  19. Linux下修改Mysql的用(root的密码及修改root登录权限
  20. .net 连接ORACLE中文显示乱码解决方案

热门文章

  1. MFC接收命令行参数的三种方法
  2. B - 考试排名
  3. Spark RDD Transformation 简单用例(一)
  4. 现在越来越喜欢用ajax传值了,这样能让网站的体验性很好,今天就总结了一下常用的
  5. POJ3628:Bookshelf 2【01背包】
  6. Docker容器集群管理之Swarm
  7. jexus手动跨域设置
  8. hdu2594 Simpsons&#39; Hidden Talents【next数组应用】
  9. hdu6397 Character Encoding 母函数解约束条件下多重集
  10. Python:多线程