Django--模板语法(常用变量,过滤器,标签,自定义过滤器与标签,inclusion_tag的html代码片的应用,模板导入,模板继承,静态文件相关操作)

模版语法(常用变量与深度查询)

html文件

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>模板渲染</title>
</head>
<body>
# 模板语言变量
<p>{{ name }}</p> <p>{{ age }}</p> <p>{{ newage }}</p> <p>{{ lis }}</p> <p>{{ tup }}</p> <p>{{ dic }}</p> <p>{{ func1 }}</p> # 深度查询 <p>{{ obj }}</p> <p>{{ obj.name }}</p> <p>{{ obj.obj_func }}</p> <p>{{ obj.cla_func }}</p> <p>{{ obj.stati_test }}</p> <p>{{ obj_lis.0.name }}</p> </body> </html>

模版语法之过滤器

{#后面就是个python中的函数,|前面的,是函数的第一个参数,冒号后面的是第二个参数#}
    length: 统计长度
            name|length

    default: {#前面为空就显示后面的参数,前面为真就显示前面的#}
        <p>{{ lis1|default:'xx' }}</p>

    filesizeformat--1:
        <p>{{ 2013344444444444444444444445555444444444444444444444444444444444444444444444444444444444443|filesizeformat }}</p>
        视图层:file_size = 103422
        <p>{{ file_size|filesizeformat }}</p>

    date:
        视图层: now_time = datetime.datetime.now()
        <p>{{ 'Y-m-d'|date:now_time }}</p>

    slice:
        <p>{{ lis|slice:'5:-1' }}</p>

    truncatechars:
        <p>{{ 'dafddfafgadfgaasdgadgfadaf'|truncatechars:7 }}</p>   dafd...   总共保留七位数,后面用三个小数点代替
    truncatewords:
        <p>{{ '我 dfaf ga dfgaas 你 dgf adaf'|truncatewords:5 }}</p>  我 dfaf ga dfgaas 你 ...

    safe:
        模板层:h1 = '<h1>你好</h1>'
        <p>{{ h1 }}</p>       标签无法解析
        <p>{{ h1|safe }}</p>   标签被解析

    add:
        <p>{{ 1|add:2 }}</p>    正常加减乘除
        <p>{{ 'asd'|add:'as'}}</p>   字符串拼接
        <p>{{ 'asd'|add:23}}</p>  为空

模版语法之标签

for标签与for...empty标签

(1)for循环嵌套下一层的值存在上一层的forloop.parentloop的字典里
    {% for foo in lis %}
        {{ forloop.counter }}
        {# 取出外层循环的值 #}
        {% for i in obj_lis %}
            {{ forloop.counter }}
            {# 取除本层循环的值 #}

            {{ forloop.parentloop.counter }}
            {# 取出外层循环的值 #}

            <p>{{ forloop }}</p>
        {% endfor %} }}
    {% endfor %}

(2)循环为空走empty之路
    {% for foo in lis %}
        <p>{{ forloop }}</p>
        {% empty %}
        <p>lxx</p>
    {% endfor %}

(3)取出字典的key
    {% for foo in dic %}
        <p>{{ foo }}</p>
    {% endfor %}

(4)取出字典的value
    {% for foo in dic.values %}
        <p>{{ foo }}</p>
    {% endfor %}

(5)取出字典的 key,value
    {% for k,value in dic.items %}
        <p>{{ k }}-----{{ value }}</p>
    {% endfor %}

 

if……else标签

  {% if user %}
       <a href="">退出</a>
       {% else %}
       <a href="">登陆</a>
       <a href="">注册</a>
  {% endif %}

自定义过滤器与标签

     -1 先app是不是已经在setting中注册
     -2 在app下创建一个templatetags(****名字不能变***)的文件夹(模块)
     -3 在模块下创建一个py文件,名字随意:mytag.py
     -4 # 第一步,导入template
        from django.template import Library
        # 第二步,定义一个叫register的变量=template.Library()
        register = Library()

    过滤器:前面四步同上
        -5 写一个函数,用@register.filter(name='yyy')装饰一下(可以指定别名)
            @register.filter(name='yyy')
            def str_add(str1, str2):
                # 业务逻辑很复杂
                return str1 + str2

            {% load mytag %}
            <p>{{ 1|yyy:2 }}</p>
            <p>{{ 'lqz'|yyy:'nb' }}</p>


    标签:前面四步同上
         -5 写一个函数,用@register.simple_tag()装饰
        templatetags文件夹里
            @register.simple_tag()
            def add_nb(value):
                return value+'nb'

            @register.simple_tag()
            def add_3(value,value2,value3):
                return value+value2+value3

        模板层里:
            <p>{% add_nb 'lxx' %}</p>
            <p>{% add_3 'lxx' 'zxx' 'yxx' %}</p>




(4)inclusion_tag  模板语法[ 引用html片段 ]    ( 联想自定义 过滤器/标签 )
-新建一个 templatetags 的文件夹 [ 名字不能变 ]
-在 templatetags 文件夹下创建 一个 xx.py

from django.template import Library
register = Library()
@register.inclusion_tag( html片段 )
def classify(username):
...
return {"category_num":category_num,... }

{% load xx %} 把 templatetags 文件夹下 xx load过来
{% 函数 参数 %}

模板导入

直接导入html文件的名字
template.html 文件不需要再写 html
在模板中: {% include '模板的名字'%} eg: {% include 'template.html'%}
<div>
    <div class="panel panel-info">
        <div class="panel-heading">重金求子</div>
        <div class="panel-body">
            重金求子:18888888
        </div>
    </div>
    <div class="panel panel-danger">
        <div class="panel-heading">
            <h3 class="panel-title">老男孩教育</h3>
        </div>
        <div class="panel-body">
            老男孩教育
        </div>
    </div>
</div>
left.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
    <style type="text/css">
        .head {
            background-color: #00AA88;
            height: 100px;
        }
    </style>
</head>
<body>
<div class="head"></div>
<div class="container-fluid content">
    <div class="row">
        <div class="col-md-3">

            {% include 'left.html' %}

        </div>
        <div class="col-md-9">
        </div>
    </div>
</div>

</body>
</html>
导入left.html文件

母板继承

(1) extends     :    {% extends 母版名字 %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
    <style type="text/css">
        .head {
            background-color: #00AA88;
            height: 100px;
        }
    </style>
</head>
<body>
<div class="head"></div>
<div class="container-fluid content">
    <div class="row">
        <div class="col-md-3">
            <div>
                <div class="panel panel-info">
                    <div class="panel-heading">重金求子</div>
                    <div class="panel-body">
                        重金求子:18888888
                    </div>
                </div>
                <div class="panel panel-danger">
                    <div class="panel-heading">
                        <h3 class="panel-title">老男孩教育</h3>
                    </div>
                    <div class="panel-body">
                        老男孩教育
                    </div>
                </div>
            </div>
        </div>

        <div class="col-md-9">
            {% block content %}
                <p>我是母板的内容</p>
            {% endblock %}
        </div>
    </div>
</div>

</body>
</html>
母板 template.html
{% extends 'template.html' %}  继承母版全部

(2)block  :    {% block 名字 %}

(1)模板中相当于定义了一个盒子
<div class="col-md-9">
{% block content %}
{% endblock content%}
</div>

(2)子版看起来是这样的
{% extends 'template.html' %} 先继承母版

{% block content %}
<p>我是母板的内容</p> 在子板中往盒子里填充内容 
{{ block.super }} 继承母版内容
{% endblock content %}
 

继承重点提示!!!

1.{% extends %} 标签,它必须是模版中的第一个标签

2.不能在一个模版中定义多个相同名字的 block 标签。

静态文件相关操作

  方法(1):写死
        <link rel="stylesheet" href="/static/css/mycss.css">
  方法(2):
       {% load static %}
        <link rel="stylesheet" href={% static 'css/mycss.css' %}>
    
{% load static %} 起别名 
    {% static "images/hi.jpg" as myphoto %}
    <img src="{{ myphoto }}"></img> 引用名字
  方法(3):
        {% load static %}
         <link rel="stylesheet" href="{% get_static_prefix %}css/mycss.css">
作业:
  1 模板语法:上课讲的,回去敲一遍(整理到博客上)
  2 常用的过滤器,自己敲一遍
  3 自定义一个过滤器:length,add(支持数字,字符串,数字字符串),
-拓展:safe
templatetags文件夹下的 mytag.py

from django.template import Library
register = Library()

@register.filter(name='length')
def str_add(str1, str2):
    try:
        return str1 + str2
    except: 
        return str(str1) + str(str2)



templates文件夹下:
 <p>{{ 1|length:2 }}</p>
<p>{{ 'lqz'|length:1.5}}</p>
答案(用自定义的过滤器)

自定义过滤器语法  {{  参数1|过滤器名字:参数2 }}

  4 自定义标签:详见下午

 

 

  


 

posted @ 2018-11-09 14:56  星牧  阅读(248)  评论(0编辑  收藏  举报