[django] 模板系统

官方文档

变量

变量相关的用{{ }},逻辑相关的用{% %}

当模版引擎遇到一个变量,它将计算这个变量,然后用结果替换掉它本身。 变量的命名包括任何字母数字以及下划线 ("_")的组合。 变量名称中不能有空格或标点符号。

点(.)在模板语言中有特殊的含义。当模版系统遇到点("."),它将以这样的顺序查询:

  • 字典查询(Dictionary lookup)
  • 属性或方法查询(Attribute or method lookup)
  • 数字索引查询(Numeric index lookup)

注意事项:

  1. 如果计算结果的值是可调用的,它将被无参数的调用。 调用的结果将成为模版的值。
  2. 如果使用的变量不存在, 模版系统将插入 string_if_invalid 选项的值, 它被默认设置为’’ (空字符串) 。

Filters(过滤器)

在Django的模板语言中,通过使用 过滤器 来改变变量的显示。

过滤器的语法:

{{ value|filter_name:参数 }}
使用管道符"|"来应用过滤器。

例如:

{{ name|lower }}
将name变量应用lower过滤器之后再显示它的值。lower:将文本全都变成小写。

常用的过滤器:

  1. default:如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:

    <p>default过滤器:{{ li|default:"如果显示为空,设置的解释性的内容" }}</p>
    
  2. length:返回值的长度。它对字符串和列表都起作用。例如:

    {{ value|length }}
    如果 value 是 ['a', 'b', 'c', 'd'],那么输出是 4。
    
  3. filesizeformat:将值格式化为一个 “人类可读的” 文件尺寸 (例如 ‘13 KB’, ‘4.1 MB’, ‘102 bytes’, 等等)。例如:

    {{ value|filesizeformat }}
    如果 value 是 123456789,输出将会是 117.7 MB。  
    
  4. date:如果 value=datetime.datetime.now()

    {{ value|date:"Y-m-d" }}  
    
  5. slice :切片

    如果 value="hello world"
    {{ value|slice:"2:-1" }}
    
  6. truncatechars 截断
    如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“…”)结尾。

    参数:要截断的字符数
    例如:

    <p>截断字符:{{ content|truncatechars:20 }}</p>
    <p>截断单词:{{ content|truncatewords:4 }}</p>
    如果content是“I am is haiyan,how are you asd df dfgfdgdg?
    

    输出结果: 截断字符:I am is haiyan,ho…

    输出结果 :截断单词:I am is haiyan,how …

  7. safe
    Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。比如:

    value="<a href="">点击</a>"
    
    {{ value|safe}}
    <p>{{ label }}</p>  <!--为了安全系统会把标签变成字符串-->
    <p>{{ label|safe }}</p>    <!--加上safe,确定你的数据是安全的才能被当成是标签-->
    

注意事项:

  1. 过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。
  2. 过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
  3. 过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:’, ’ }}
  4. '|'左右 没有空格 没有空格 没有空格

django内置过滤器详看liwenzhou

Tags

  1. for循环

    <ul>
    	{% for user in user_list %}
    	    <li>{{ user.name }}</li>
    	{% endfor %}
    </ul>
    
  2. for循环一些参数

    forloop.counter	当前循环的索引值(从1开始)
    forloop.counter0	当前循环的索引值(从0开始)
    forloop.revcounter	当前循环的倒序索引值(从1开始)
    forloop.revcounter0	当前循环的倒序索引值(从0开始)
    forloop.first	当前循环是不是第一次循环(布尔值)
    forloop.last	当前循环是不是最后一次循环(布尔值)
    forloop.parentloop	本层循环的外层循环
    
  3. for … empty :在给出的组是空的或者没有被找到时,可以有所操作

    <ul>
    {% for user in user_list %}
        <li>{{ user.name }}</li>
    {% empty %}
        <li>空空如也</li>
    {% endfor %}
    </ul>
    
  4. if判断

    {% if user_list %}
      用户人数:{{ user_list|length }}
    {% elif black_list %}
      黑名单数:{{ black_list|length }}
    {% else %}
      没有用户
    {% endif %}
    
  5. with:使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的

    {% with total=business.employees.count %}
        {{ total }} employee{{ total|pluralize }}
    {% endwith %}
    或
    
    {% with business.employees.count as total %}
        {{ total }} employee{{ total|pluralize }}
    {% endwith %}
    
  6. csrf_token:跨站请求伪造保护

    在页面的form表单里面写上
    {% csrf_token %}
    
  7. 注释

    {# ... #}
    
  8. 注意事项

    1. Django的模板语言不支持连续判断,即不支持以下写法:

       {% if a > b > c %}
       ...
       {% endif %}
      
    2. Django的模板语言中属性的优先级大于方法

       def xx(request):
           d = {"a": 1, "b": 2, "c": 3, "items": "100"}
           return render(request, "xx.html", {"data": d})
      

      如上,我们在使用render方法渲染一个页面的时候,传的字典d有一个key是items并且还有默认的 d.items() 方法,此时在模板语言中:

       {{ data.items }}
      

      默认会取d的items key的值。

母板

母版页用于处理html页面相同部分内容,避免在不同的页面中重复出现
我们通常会在母板中定义页面专用的CSS块和JS块,方便子页面替换。

添加母版页,使用 block进行占位

{% block content %} {% endblock %}

继承母板,在具体页面使用母版页

{% extends 'layouts.html' %}

{% block content%}
This is ChildPageContent
{% endblock %}

组件 include

可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可。

直接include ‘html’即可应用
{% include 'navbar.html' %}

static静态文件相关

{% static %}
{% load static %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!" />

引用JS文件时使用:

{% load static %}
<script src="{% static "mytest.js" %}"></script>

某个文件多处被用到可以存为一个变量

{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}"></img>
{% get_static_prefix %}
{% load static %}
<img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />

或者

{% load static %}
{% get_static_prefix as STATIC_PREFIX %}

<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" />
<img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />

simple_tag 自定义标签过滤器

  1. 注册当前app,在app中创建templatetags模块

  2. 创建任意 .py 文件,如:xx.py

    from django import template
    from django.utils.safestring import mark_safe
       
    register = template.Library()
       
    @register.simple_tag
    def my_simple_time(v1,v2,v3):
        return  v1 + v2 + v3
       
    @register.simple_tag
    # filter使用@register.filter
    def my_input(id,arg):
        result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
        return mark_safe(result)
    
  3. 在使用自定义simple_tag的html文件中导入之前创建的 xx.py 文件名

    {% load xx %}
    
  4. 使用simple_tag

    {% my_simple_time 1 2 3%}
    {% my_input 'id_username' 'hide'%}
    

    过滤器: {{ var|filter_name:参数 }} # 参数只能是两个,一个参数是变量var ,一个是参数是后面的那个参数,不能加空格

    标签: {% simple_tag 参数1 参数2 … %}

    -------------------------------.html
    {% load xxx %}  
          
    # num=12
    {{ num|multi:2 }} #24
     
    {{ num|multi:"[22,333,4444]" }}   相当于复制了,吧[22,333,4444]乘了num遍
    {% multitag 2 5 6 %} 参数不限,但不能放在if for语句中 {% simple_tag_multi num 5 %}
    

    自定义过滤器函数的参数只能两个,可以进行逻辑判断
    自定义标签无参数限制,不能进行逻辑判断

    {% if i|multi:5 > 1000 %}   <!-- 判断i*5>1000 -->
        <p>大于{{ i }}</p>
    {% else %}
        <p>大于等于{{ i }}</p>
    {% endif %}
    
posted @ 2019-10-03 18:30  Moke丶青  阅读(108)  评论(0编辑  收藏  举报