[django] 模板系统
变量
变量相关的用{{ }},逻辑相关的用{% %}
当模版引擎遇到一个变量,它将计算这个变量,然后用结果替换掉它本身。 变量的命名包括任何字母数字以及下划线 ("_")的组合。 变量名称中不能有空格或标点符号。
点(.)在模板语言中有特殊的含义。当模版系统遇到点("."),它将以这样的顺序查询:
- 字典查询(Dictionary lookup)
- 属性或方法查询(Attribute or method lookup)
- 数字索引查询(Numeric index lookup)
注意事项:
- 如果计算结果的值是可调用的,它将被无参数的调用。 调用的结果将成为模版的值。
- 如果使用的变量不存在, 模版系统将插入 string_if_invalid 选项的值, 它被默认设置为’’ (空字符串) 。
Filters(过滤器)
在Django的模板语言中,通过使用 过滤器 来改变变量的显示。
过滤器的语法:
{{ value|filter_name:参数 }}
使用管道符"|"来应用过滤器。
例如:
{{ name|lower }}
将name变量应用lower过滤器之后再显示它的值。lower:将文本全都变成小写。
常用的过滤器:
-
default:如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:
<p>default过滤器:{{ li|default:"如果显示为空,设置的解释性的内容" }}</p>
-
length:返回值的长度。它对字符串和列表都起作用。例如:
{{ value|length }} 如果 value 是 ['a', 'b', 'c', 'd'],那么输出是 4。
-
filesizeformat:将值格式化为一个 “人类可读的” 文件尺寸 (例如 ‘13 KB’, ‘4.1 MB’, ‘102 bytes’, 等等)。例如:
{{ value|filesizeformat }} 如果 value 是 123456789,输出将会是 117.7 MB。
-
date:如果 value=datetime.datetime.now()
{{ value|date:"Y-m-d" }}
-
slice :切片
如果 value="hello world" {{ value|slice:"2:-1" }}
-
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 …
-
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,确定你的数据是安全的才能被当成是标签-->
注意事项:
- 过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。
- 过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
- 过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:’, ’ }}
- '|'左右 没有空格 没有空格 没有空格
django内置过滤器详看liwenzhou
Tags
-
for循环
<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% endfor %} </ul>
-
for循环一些参数
forloop.counter 当前循环的索引值(从1开始) forloop.counter0 当前循环的索引值(从0开始) forloop.revcounter 当前循环的倒序索引值(从1开始) forloop.revcounter0 当前循环的倒序索引值(从0开始) forloop.first 当前循环是不是第一次循环(布尔值) forloop.last 当前循环是不是最后一次循环(布尔值) forloop.parentloop 本层循环的外层循环
-
for … empty :在给出的组是空的或者没有被找到时,可以有所操作
<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% empty %} <li>空空如也</li> {% endfor %} </ul>
-
if判断
{% if user_list %} 用户人数:{{ user_list|length }} {% elif black_list %} 黑名单数:{{ black_list|length }} {% else %} 没有用户 {% endif %}
-
with:使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的
{% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %} 或 {% with business.employees.count as total %} {{ total }} employee{{ total|pluralize }} {% endwith %}
-
csrf_token:跨站请求伪造保护
在页面的form表单里面写上 {% csrf_token %}
-
注释
{# ... #}
-
注意事项
-
Django的模板语言不支持连续判断,即不支持以下写法:
{% if a > b > c %} ... {% endif %}
-
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 自定义标签过滤器
-
注册当前app,在app中创建templatetags模块
-
创建任意 .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)
-
在使用自定义simple_tag的html文件中导入之前创建的 xx.py 文件名
{% load xx %}
-
使用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 %}