模板语法之数据传递
将数据从后端传给前端页面的方法
# 第一种
return render(request,'index.html',{'n':n})
# 第二种
return render(request,'index.html',locals())
# 将当前所在的名称空间中的名字全部传递给前端页面
python所有数据类型都可以传
传函数名——传过来会自动加括号调用,显示返回值。
传对象——对象内存地址,等于后端print对象,可通过点方法获取属性或调用方法
模板语法不能传参,若函数或方法有参数,不能使用
前端获取后端传过来的容器类型的内部元素,通过句点符.
。.数字
,数字就是索引,字典就是用.key
。
也可点各个数据类型的内置方法(不需要传参的)
前端两种注释
模板语法的注释不会展示到前端页面:{#注释#}
原生html注释会展示到前端:<!--注释-->
这里的展示到前端是指检查前端代码时是否可见。
模板语法之过滤器
语法:{{后端传来的数据 | 过滤方法}},前面的值会当做第一个参数传递给|后面的函数
统计字符串或列表长度:length
传入的值是空则返回default后面默认参数:default:'传值为空'
将数字格式化成表示文件大小的单位:filesizeformat
格式化时间(不要加百分号):date:'Y-m-d'
切片:slice:'0:8:2'
截取固定的长度的字符串,三个点也算:truncatechars:长度
按照空格截取文本内容:truncatewords:空格数
给数字加一个值,如果第一个参数是字符串,会默认全转成字符串进行拼接:add
取消转义:默认不会识别标签语法,防止危险攻击。取消转义后能识别
前端
safe
后端
from django.utils.safestring import mark_safe
x = mark_safe('<h1>我是h1标签</h1>')
模板语法之标签
# for循环
{% for foo in l %}
<p>{{ foo }}</p>
<p>{{ forloop }}</p>
{% endfor %}
# if判断
{% if flag %}
<p>flag不为空</p>
{% else %}
<p>flag是空</p>
{% endif %}
# 嵌套使用
{% for foo in l %}
{% if forloop.first %}
<p>这是我的第一次</p>
{% elif forloop.last %}
<p>这是最后一次了啊</p>
{% else %}
<p>嗨起来!!!</p>
{% endif %}
{% endfor %}
# empty
当你的for循环对象为空的时候会自动走empty代码块儿的内容
后端:
l = None
前端:
{% for foo in l %}
{% if forloop.first %}
<p>这是我的第一次</p>
{% elif forloop.last %}
<p>这是最后一次了啊</p>
{% else %}
<p>嗨起来!!!</p>
{% endif %}
{% empty %}
<p>你给我的容器类型是个空啊,没法for循环</p>
{% endfor %}
模板语法之自定义
必须先做的事
-
在应用名下新建一个名为templatetags文件夹(必须叫这个名字)
-
在该新建的文件夹内新建一个任意名称的py文件
-
在该py文件中需要固}定写下面两句代码
-
在前端页面{%load 新建的py文件%}
from django import template register = template.Library()
自定义过滤器
# 后端
@register.filter(name='XBB')
def index(a,b):
return a+b
# 前端
{{ 666|XBB:8 }}
自定义标签
# 后端
@register.simple_tag
def plus(a,b,c):
return a+b+c
# 前端
{% plus 1 2 3 %}
自定义inclusion_tag
# 自定义inclusion_tag
@register.inclusion_tag('login.html',name='login')
def login(n):
l = [ '第%s项'%i for i in range(n)]
return {'l':l}
# login.html
<ul>
{% for foo in l %}
<li>{{ foo }}</li>
{% endfor %}
</ul>
# 调用
{% login 5 %}
模板的继承与导入
继承
首先需要在被继承的模板中划分多个区域
{% block 给区域起的名字 %}
{% endblock %}
通常情况下一个模板中应该至少有三块
{% block css %}
页面css代码块
{% endblock %}
{% block js %}
页面js代码块
{% endblock %}
{% block content %}
页面主体内容
{% endblock %}
子板继承模板
先继承模板所有的内容
{% extends 'home.html' %}
然后根据block块的名字修改指定区域的内容
{% block 想修改区域的名字 %}
修改
{% endblock %}
导入
模板的导入:将一段html当做模块的方式导入到另一个html展示
{% include '想导入的html文件名' %}
静态文件配置
{% load static %}
# 第一种方式
<link rel='stylesheet' href="{% static 'css/mycss.css'%}">
# 第二种方式
<link rel='stylesheet' href="{% get_static_prefix %}css/mycss.css">