Django 模板

Django模板系统
常用语法
{{ }}和 {% %}
变量相关的用{{}},逻辑相关的用{% %}。

变量
{{ 变量名 }}
变量名由字母数字和下划线组成。
点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值。

模板中支持的写法:
{# 取l中的第一个参数 #}
{{ l.0 }}
{# 取字典中key的值 #}
{{ d.name }}
{# 取对象的name属性 #}
{{ person_list.0.name }}
{# .操作只能调用不带参数的方法 #}
{{ person_list.0.dream }}

Filters
语法: {{ value|filter_name:参数 }}
'|'左右没有空格没有空格没有空格

default #默认
{{ value|default: "这个变量没有传值就使用默认值"}}
如果value值没传的话就显示default后面定义的默认参数

length #长度
{{ value|length }}
返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.

filesizeformat #格式化大小
将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:
{{ value|filesizeformat }}
如果 value 是 123456789,输出将会是 117.7 MB。

slice #切片
把字符串按冒号右边规则切片
{{value|slice:"2:-1"}}

date #时间格式化
根据冒号右边格式进行时间格式化
{{ value|date:"Y-m-d H:i:s"}}

safe #告诉浏览器安全
浏览器上显示a标签样式
value = "<a href='#'>点我</a>"
{{ value|safe}}

truncatechars #字符过多截断
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
参数:截断的字符数
{{ value|truncatechars:9}}

自定义filter
1、先在app下定义文件夹templatetags,然后建一个存放自定义filter的文件
app01/
__init__.py
models.py
templatetags/ # 在app01下面新建一个package package
__init__.py
app01_filters.py # 建一个存放自定义filter的文件
views.py
2.先在自定义的文件中导入
from django import template
register = template.Library()
然后定义函数,@register.filter(name="cut")装饰器用来给filter名命,此例名命cut,
一个参数,那就是管道符前面的参数
如果有两个参数,第一个参数就是管道符前面的值,后面的参数就是管道符后面方法内的参数
@register.filter(name="cut")
def cut(value, arg):
return value.replace(arg, "")

Tags
if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。
Django的模板语言中属性的优先级大于方法
Django的模板语言不支持连续判断
Variable Description
forloop.counter 当前循环的索引值(从1开始)
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(从1开始)
forloop.revcounter0 当前循环的倒序索引值(从0开始)
forloop.first 当前循环是不是第一次循环(布尔值)
forloop.last 当前循环是不是最后一次循环(布尔值)
forloop.parentloop 本层循环的外层循环

for ... empty
如果for循环中什么都没有,则执行empty下的代码
<ul>
{% for user in user_list %}
<li>{{ user.name }}</li>
{% empty %}
<li>空空如也</li>
{% endfor %}
</ul>

with
定义一个中间变量,有时候变量太长用with,赋值,然后再with内就可以用被赋值的代替赋值的
{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}

csrf_token
这个标签用于跨站请求伪造保护。
在页面的form表单里面写上{% csrf_token %}


母版和继承
1. 为什么要有模板和继承:
把多个页面公用的部分提取出来,放在一个 母版 里面。
其他的页面只需要 继承 母版就可以了。
2. 具体使用的步骤:
1. 把公用的HTML部分提取出来,放到base.html文件中
2. 在base.html中,通过定义block,把每个页面不同的部分区分出来
3. 在具体的页面中,先继承母版
4. 然后block名去指定替换母版中相应的位置

3. 使用母版和继承的注意事项:
1. {% extends 'base.html' %} --> 母版文件:base.html要加引号
2. {% extends 'base.html' %}必须放在子页面的第一行!!!
3. 可以在base.html中定义很多block,通常我们会额外定义page-css和page-js两个块
4. view.py相应的函数中返回的是对应的子页面文件 不是不是不是 base.html

继承母板:
{% extends '模板文件' %}

块(block)
通过在母板中使用{% block xxx %}来定义"块"。
在子页面中通过定义母板中的block名来对应替换母板中相应的内容。
{% block page-main %}
<p>世情薄</p>
<p>人情恶</p>
<p>雨送黄昏花易落</p>
{% endblock %}

{% block page-css %}
用于导入独自的css文件
{% endblock %}

{% block page-js %}
用于导入独自的js文件
{% endblock %}

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

静态文件相关
{% 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>

自定义simpletag
和自定义filter类似,只不过接收更灵活的参数。
定义注册simple tag

@register.simple_tag(name="plus")
def plus(a, b, c):
return "{} + {} + {}".format(a, b, c)

使用自定义simple tag
{% load app01_demo %}
{# simple tag #}
{% plus "1" "2" "abc" %}

inclusion_tag
多用于返回html代码片段

示例:

templatetags/my_inclusion.py

from django import template
register = template.Library()

@register.inclusion_tag('result.html')
def show_results(n):
n = 1 if n < 1 else int(n)
data = ["第{}项".format(i) for i in range(1, n+1)]
return {"data": data}

templates/snippets/result.html

<ul>
{% for choice in data %}
<li>{{ choice }}</li>
{% endfor %}
</ul>

templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>inclusion_tag test</title>
</head>
<body>

{% load inclusion_tag_test %} # load 后面跟的是py文件名

{% show_results 10 %} #函数名加参数
</body>
</html>



posted @ 2018-07-05 18:30  yangli0504  阅读(149)  评论(0编辑  收藏  举报