模板层

1 变量 过滤器
2 标签

filter
{{}}
    1 变量
        1 句点符,深度查询 
        2 可以点到方法,不要加括号,只能是无参的方法 
        3 xss跨站脚本攻击: 比如提交评论<script>alert('dsb')</script> 存到数据库 响应到html 浏览器解释 就会弹窗 如果for循环一千次或者多次 页面就崩了
         这就是xss攻击  所以一定要处理
        如果不要django处理(比如:<用&gt; 替换) 
        就要显示标签可以这样处理:
            1 ss3=mark_safe(ss3)        from django.utils.safestring import mark_safe                 在views中
            2 <p>safe过滤器:  {{ ss3|safe }}</p>                                                       html中
       3 @register.simple_tag(is_safe=False)  默认是true,防止xss攻击,显示字符串。false浏览器直接解释标签 自定义标签时设置false
2 过滤器 冒号后不能加空格 now是第一个参数,冒号后面是第二个参数 <p>date过滤器 {{ now|date:'Y-m-d:H:i:s' }}</p> <p>date过滤器 {{ now|date }}</p> 如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如: <p>default过滤器 {{ ss2|default:'字符串没有值' }}</p> <p>default过滤器 {{ ll3|default:'列表没有值' }}</p> 返回值的长度。它对字符串和列表都起作用 <p>length过滤器 {{ ll2|length }}</p> 将值格式化为一个 “人类可读的” 文件尺寸 单位是B (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如: <p>filesizeformat过滤器 {{ file|filesizeformat }}</p> <p>filesizeformat过滤器 {{ 1024|filesizeformat }}</p> 切片操作 <p>slice过滤器 {{ 'lqzisbig'|slice:'1:9' }}</p> 如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾 带空格的字符串不算点的数量 不带空格的字符串算点的数量 <p>truncatechars过滤器 {{ 'lqzisbigdddddddeee'|truncatechars:9 }}</p> <p>truncatewords过滤器: {{ 'lqz is big and egon is small'|truncatewords:3 }}</p xss攻击:跨站脚本攻击 1 在html中处理 <p>safe过滤器: {{ ss3|safe }}</p> 2 {#也可以在视图函数里处理#} from django.utils.safestring import mark_safe ss3=mark_safe(ss3) 俩参数可以传字符串和数字,具体详见源码 <p>add过滤器: {{ 12|add:"3" }}</p> <p>add过滤器: {{ 'eee'|add:"3rrr" }}</p> tag {% %} for :forloop {%for i in ll%} #必须再for循环里使用 {{forloop}} 字典 # {% empty%}} 判断是否为空 {% endfor%} if if语句支持 andor、==、>、<、!=、<=、>=、innot inisis not判断。 {%if 条件%} {% endif%} {% with aa=dic.name%} 起别名 {{aa}} {%endwith%}
from django import template

register=template.Library()

@register.filter
def myadd(value,arg):
    if type(value) == type(arg) == int or type(value) == type(arg) == str:
        return value+arg
    elif type(value) == int and type(arg) == str:
        return str(value) + arg
    elif type(value) == str and type(arg) == int:
        return value + str(arg)
    else:
        return '参数只能是数字或字符串'

@register.simple_tag
def myfactorial(n):
    if type(n) != int:
        # raise ValueError
        return 'ValueError'
    if n == 0 or n == 1:
        return 1
    else:
        return (n*myfactorial(n-1))
自定义标签
from django.shortcuts import render

from django.utils.safestring import mark_safe
# Create your views here.

class Person:
    def __init__(self,name):
        self.name = name

    @classmethod
    def class_test(cls):
        print('class method')
        return 'class method'
    def test(self):
        print('method')
        return self.name

    # def __str__(self):
    #     return self.name


def index(request):

    n1 = 1
    n2 = 2
    n3 = 5
    s1='a'
    s2='b'

    ss='lqz is big'
    i=20
    ll=['lqz',18,[1,2,[2,3]]]
    ll4=[[1,2,3],[2,3,4],[1,2,9]]
    dic={'name':'lqz','age':18,'t':[1,2,[2,3]]}
    b=True
    lqz=Person('lqz')
    egon=Person('egon')
    xiaohou=Person('xiaohou')
    monkey=Person('monkey')
    ll2=[lqz,egon,xiaohou,monkey]
    dic2={'lqz':lqz,'egon':egon}
    # print(lqz.class_test())
    # print(dic['name'].upper)
    ll3=[]
    ss2=''
    ss3='<a href="https://www.baidu.com">点我</a>'
    # ss3=mark_safe(ss3)
    import datetime
    now=datetime.datetime.now()
    file=1024*1024*1024


    return render(request,'index.html',locals())
    # return render(request,'index.html',{'ss':ss,})  建议使用这种
视图函数
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
    {% load static %}
    <link rel="stylesheet" href="{% static 'mycss.css' %}">
{#    <link rel="stylesheet" href="/staticaa/mycss.css">#}
</head>
<body>
<div>静态文件写活</div>

<hr>

{% load my_tags %}
{#{{ '12'|add }}#}
<p>{{ n1|myadd:n2 }}</p>
<p>{{ s1|myadd:s2 }}</p>
<p>{{ s1|myadd:n2 }}</p>
<p>{{ '@#@'|myadd:33 }}</p>
{% myfactorial 'a' %}


自定义的过滤器,可以放在if判断里,
自定义的标签,不能放在if判断里条件里
<hr>

<h3>变量</h3>
<p>字符串:{{ ss }}</p>
<p>数字:{{ i }}</p>
<p>列表:{{ ll }}</p>
<h3>句点符,做深度查询</h3>
<p>列表第2个值:{{ ll.2.2.0}}</p>
<p>布尔类型:{{ b}}</p>
<p>字典:{{ dic }}</p>
<p>字典取值:{{ dic.age }}</p>
<p>字典取值:{{ dic.t.2.1 }}</p>
<p>对象:{{ lqz }}</p>
<p>对象取值:{{ lqz.name }}</p>
<h2>对象方法,不要加括号</h2>
<p>对象方法:{{ lqz.test }}</p>
<p>类方法:{{ lqz.class_test }}</p>
<h3>注释:前端看不到,django给处理了</h3>
{#<p>类方法:{{ Person}}</p>#}

<p>列表对象{{ ll2 }}</p>
<p>列表对象取值{{ ll2.1 }}</p>
<p>列表对象取值,在取值{{ ll2.1.name }}</p>

<p>对象字典{{ dic2 }}</p>
<p>对象字典取值{{ dic2.egon.name }}</p>
<p>空列表的情况就是一个空列表{{ ll3 }}</p>
<p>空字符串的情况    直接替换成空{{ ss2 }}</p>

<h3>xss 跨站脚本攻击
    django为了解决这种攻击行为所以对标签进行了处理 特殊符号替换 浏览器不能直接解释标签只能原样输出
    ,如果想直接让浏览器解释这个标签 需要用 mark_safe()函数 在views中 告诉django不要处理</h3>
<p>a标签 {{ ss3 }}</p>
<h4>字典:{{ ss.upper }}</h4>
<h4>字典:{{ dic.name.upper }}</h4>
&lt

{#<script>alert('dsb')</script>#}
{# xss:比如提交评论 存到数据库 响应到html 浏览器解释 就会弹窗 这就是xss攻击  所以一定要处理 #}

<h2>过滤器</h2>
冒号后不能加空格 now是第一个参数,冒号后面是第二个参数
<p>date过滤器 {{ now|date:'Y-m-d:H:i:s' }}</p>
<p>date过滤器 {{ now|date }}</p>
<hr>
如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:
<p>default过滤器  {{ ss2|default:'字符串没有值' }}</p>
<p>default过滤器  {{ ll3|default:'列表没有值' }}</p>
<hr>
返回值的长度。它对字符串和列表都起作用
<p>length过滤器  {{ ll2|length }}</p>
<hr>
将值格式化为一个 “人类可读的” 文件尺寸 单位是B(例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:
<p>filesizeformat过滤器  {{ file|filesizeformat }}</p>
<p>filesizeformat过滤器  {{ 1024|filesizeformat }}</p>
<hr>
切片操作
<p>slice过滤器  {{ 'lqzisbig'|slice:'1:4' }}</p>
<hr>
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾
带空格的字符串不算点的数量
不带空格的字符串算点的数量
<p>truncatechars过滤器  {{ 'lqzisbigdddddddeee'|truncatechars:9 }}</p>
<p>truncatewords过滤器:  {{ 'lqz is big and egon is small'|truncatewords:3 }}</p>
<hr>

<p>safe过滤器:  {{ ss3|safe }}</p>
{#可以在视图函数里处理 ss3=mark_safe(ss3)#}
<p>{{ ss3 }}</p>
<hr>
俩参数只能传字符串和数字 相加,具体详见源码
<p>add过滤器:  {{ 12|add:"3" }}</p>
<p>add过滤器:  {{ 'eee'|add:"3rrr" }}</p>

<hr>
<h1>模板语法之标签</h1>

{% for foo in ll %}
    <p>{{ forloop }}</p>
    <p>{{ forloop.counter }}</p>
    <p>{{ forloop.counter0 }}</p>
    <p>{{ forloop.revcounter }}</p>
    <p>{{ forloop.revcounter0 }}</p>
    <p>{{ forloop.first }}</p>
    <p>{{ forloop.last }}</p>
    {% if forloop.first %}
        lqz is big
        {% elif forloop.last %}
        俩人都小
        {% else %}
        egon is small

    {% endif %}

    <p>{{ foo }}</p>

{% endfor %}
<hr>
{% for foo in ll %}
    <p>{{ foo }}</p>
    {% empty %}
     没有值
{% endfor %}
<hr>
{% for foo in ll3 %}
    <p>{{ foo }}</p>

    {% empty %}
    一定要放在for循环中
     没有值
{% endfor %}
<hr>

{% for foo in ll4 %}
    {% for i in foo %}
        <p>{{ forloop }}</p>
       <p>{{ forloop.parentloop }}</p>


    {% endfor %}

{% endfor %}
<hr>

if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

{% with ttttt=dic.name %}
    相当于重新赋值
    <p>{{ dic.name }}</p>
    <p>{{ ttttt }}</p>
    <p>{{ ttttt }}</p>
    <p>{{ ttttt }}</p>


{% endwith %}

<hr>

<hr>
</body>
</html>
模板层

4 静态文件动态引入

静态文件(static)引入的三种方式: 关注的文件:html和settings
核心:如果STATIC_URL = '/static/'--- >STATIC_URL = '/staticaaa/'     改变则动态引入的两种方式自动改变
        一:
        <link rel="stylesheet" href="/static/dd/ssmycss.css">
    二:
        {% load static %}
        <link rel="stylesheet" href="{% static 'dd/ss/mycss.css' %}">
        {#    返回值:/static/dd/ss/mycss.css#}
    三:
        <link rel="stylesheet" href="{% get_static_prefix %}dd/ss/mycss.css">

5 模板导入和继承

模板导入和继承  html之间的问题
    模板导入: 通用部分的html代码解决复用性
     1 把公共部分,放到html里,比如叫 left.html
     2 想在哪里用 {% include 'left.html' %}  index.html
    母版继承: 修改覆盖或者追加母版
        1  写一个母版 base.html
        2 要更改的地方(    )
        {% block base %}
            母版的盒子里也可以写东西
        {% endblock %}
        3 调用:
            3.1 写在第一行 {%extends 'base.html' %}
            3.2         {% block base %}
            
                        自己的东西
                        
                        {% endblock my_head%}
            3.3 还想用母版里的内容({{block.super}} 放在那,原来母版里的东西,就会渲染在哪)
                    {% block base %}
                        {{block.super}}
                        自己的东西                        
                    {% endblock my_head%}
            3.4 如过不继承盒子,它会用原来的内容,如果继承了,没写自己的东西,它会空白
            3.5 盒子再继承时,跟顺序无关
<div>
    <div class="panel panel-danger">
        <div class="panel-body">
            Panel content
        </div>
        <div class="panel-footer">Panel footer</div>
    </div>

    <div class="panel panel-success">
        <div class="panel-body">
            Panel content
        </div>
        <div class="panel-footer">Panel footer</div>
    </div>
    <div class="panel panel-primary">
        <div class="panel-body">
            Panel content
        </div>
        <div class="panel-footer">Panel footer</div>
    </div>
</div>
left.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    <style>
        .head {
            height: 30px;
            background-color: pink;
        }
    </style>
</head>
<body>
<div class="head"></div>
<div class="container-fluid">
    <div class="row">
        <div class="col-md-3">
            {% include 'left.html' %}
        </div>

        <div class="col-md-9">
        </div>
    </div>
</div>
</body>
</html>
index.html

继承

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    {% block myhead %}
        <title>index</title>
    {% endblock %}

    {% block top %}
        {% load static %}
        <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    {% endblock %}

    <style>
        .head {
            height: 30px;
            background-color: pink;
        }
    </style>
</head>
<body>
<div class="head"></div>
<div class="container-fluid">
    <div class="row">
        <div class="col-md-3">
            {% block left %}

            {% endblock %}
        </div>

        <div class="col-md-9">
            {% block right %}
                <h1>right</h1>
            {% endblock %}
        </div>
    </div>
</div>
</body>
</html>
base.html
{% extends 'base.html' %}

{% block myhead %}
    <title>order</title>
    {{ block.super }}

{% endblock myhead %}

{% block top %}
    {% load static %}
    <link rel="stylesheet" href="{% get_static_prefix %}bootstrap-3.3.7-dist/css/bootstrap.min.css">
{% endblock top %}

{% block left %}
    <h1>left</h1>
    {% include 'left.html' %}
{% endblock left %}

{% block right %}
    <h1>aaaaaaaaaaaaaaaaa</h1>
    {{ block.super }}
    <h1>adfasdfasd</h1>

    {% load mytags %}
    {% my_inclusion 10 %}
{% endblock %}
order.html

 3 自定义标签,过滤器,inclusion_tag


自定义过滤器 1 先去setting里面把app名字配置上 2 再app目录下创建一个templatetags模块 3 写py文件(my_test.py) 4 from django import template 5 register=template.Library() 6 写函数 addstr(用register.filter()装饰) 7 模板: 8 {% load my_test %} 9 {{'lqz'|addstr:'isbig' }} #最多只能传两个参数 自定义标签: settings app01-templatetags-my_test.py 1 先去setting里面把app名字配置上 (除非新加的一般都是弄好的) 2 再app目录下创建一个templatetags模块 3 写py文件(my_test.py) 4 from django import template 5 register=template.Library() 6 写函数 my_sum@register.simple_tag(name='yy')装饰) @register.simple_tag(name='yy') def my_sum(x,y,z,i): return x+y+z+i 7 模板: 8 {% load my_test %} 9 {% yy 12 34 56 78 %} #以空格做分割,传参数 @register.simple_tag(name='yy') @register.simple_tag(is_safe=False) 默认是true,防止xss攻击,显示字符串。false浏览器直接解释标签 自定义的过滤器,可以放在if判断里, 自定义的标签,不能放在if判断里条件里 练习: 自定义一个标签(输入一个值,计算出阶乘,显示再页面) 自定义一个过滤器 (输入两个参数,做累加,支持数字,字符串(如果一个数字,一个字符串,强行相加))


自定义 inclusion_tag 返回字典(其值必须是可迭代对象),数据给指定的html使用,生成的html在html中和一般自定义标签一样使用 1 先去setting里面把app名字配置上 2 再app目录下创建一个templatetags模块 3 写py文件(mytags.py) 4 from django import template 5 register=template.Library() 6 @register.inclusion_tag('test.html') def my_inclusion(n): data=[] for i in range(n): data.append('第%s行'%i) return {'data':data} 7 写test.html页面
<ul> {% for choice in data %} <li>{{ choice }}</li> {% endfor %} </ul> 8 {% load my_test %} #order.html引用 9 {% my_inclusion 10 %} 它会返回html的页面
from django import template

register=template.Library()

@register.inclusion_tag('test.html')
def my_inclusion(n):
    data = []
    for i in range(n):
        data.append('第%s行' %i)
    return {'data':data}
mytags.py
<ul>
    {% for foo in data %}
        <li>{{ foo }}</li>
    {% endfor %}

</ul>
test.html
{% extends 'base.html' %}

{% block myhead %}
    <title>order</title>
    {{ block.super }}

{% endblock myhead %}

{% block top %}
    {% load static %}
    <link rel="stylesheet" href="{% get_static_prefix %}bootstrap-3.3.7-dist/css/bootstrap.min.css">
{% endblock top %}

{% block left %}
    <h1>left</h1>
    {% include 'left.html' %}
{% endblock left %}

{% block right %}
    <h1>aaaaaaaaaaaaaaaaa</h1>
    {{ block.super }}
    <h1>adfasdfasd</h1>

    {% load mytags %}
    {% my_inclusion 10 %}
{% endblock %}
order.html
原文地址:https://www.cnblogs.com/xujinjin18/p/9601168.html