标签
{% %} 标识符
- 标签分为单标签和成对的标签
- 成对的标签切记不能省略,开始标签和结束标签ifequal 如果相等
{% ifequal value1 value2 %}
语句
{% endifequal %}
ifnotequal 如果不相等
实践:第五行变色
<ul>
{% for student in students %}
{% ifequal forloop.counter 5 %}
<li style="color: red">{{ student.s_name }}</li>
{% else %}
<li style="color: cornflowerblue">{{ student.s_name }}</li>
{% endifequal %}
{% endfor %}
</ul>
url: 反向解析
{% url 'namespace:name' p1 p2 %}
csrf_token
用于跨站请求伪造保护的
格式 {% csrf_token %}
跨站请求伪造
某些恶意网站包含链接,表单,按钮,Js利用登陆用户在浏览器中的认证信息,进行非法操作,攻击服务,破坏数据
在表单中添加
{% csrf_token %}
在settings中的中间件MIDDLEWARE中配置打开
'django.middleware.csrf.CsrfViewMiddleware',
过滤器: {{var|过滤器 }}
加法:
add {{ p.page | add : 5 }}
没有减法过滤器,但是加法里可以加负数
{{ p.page | add : -5}}
实践:
<h3>{{ count|add:5 }}</h3>
<h3>{{ count|add:-5 }}</h3>
lower:转成小写
upper:转成大写
{{ p.pname|upper }}
实践:
<h3>{{ student_dict.hobby|upper }}</h3>
过滤器可以传递参数,参数需要使用引号引起来
比如join: {{
students|join '=' }}
默认值:default,格式
{{var|default
value}}
如果变量没有被提供或者为False,空,会使用默认值
根据指定格式转换日期为字符串,处理时间的
就是针对date进行的转换
HTML转义
将接收到的数据当成普通字符串处理还是当成HTML代码来渲染的一个问题
渲染成html:{{ code|safe}} 但是要小心JS注入,确保数据是真的安全可靠
{% autoescape
off%}
code
{% endautoescape %}
不想渲染
{% autoescape
on%}
code
{% endautoescape %}
模板继承(重要)
模板也可以继承
关键字block:挖坑
{% block XXX%}
code
{% endblock %}
extends
继承,写在开头位置
{% extends
'父模板路径'
%}
include: 加载模板进行渲染
格式{% include '模板文件'
%}
比如说淘宝首页
头部:
在大部分地方都是统一有这个头部文件的
规划页面先去排版,在模板中用block对网页进行规划,划分区域
比如说淘宝首页的头部
结构标签
block
- 块
- 用来规划我们的布局 (挖坑)
- 首次出现,代表规划
- 第二次出现,代表填充以前的规划
第三次出现, 代表填充以前的规划,默认动作是覆盖
- 如果不想覆盖,可以添加 {{ block.super }}
- 这样就实现了增量式操作
extends
- 继承
- 可以获取父模板中的所有结构
block + entends
- 化整为零,将一个很复杂的页面切割成很多小页面,然后一点一点的制作出来
include
- 包含
- 可以将页面作为一部分,嵌入到其它页面中
include + block
- 由零聚一,一块块聚成一起
- 三个标签也可以混合使用
- 但是能用block + extends搞定的 就尽量不要使用include,性能低
- 如果我们继承自一个父模板,子模版自己直接重写页面结构是不生效的,只能在已有坑中进行填充,如果我们的html继承自父模板,我们只能在规划好的坑里填数据,如果在坑外填写标签,会被自动优化掉。
实践:block+extends
模板中新建一个base.html
这个html用来规划网站首页的布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
{% block header %}
{% endblock %}
{% block banner %}
{% endblock %}
{% block coutent %}
{% endblock %}
{% block footer %}
{% endblock %}
</body>
</html>
再建一个首页home.html,进行填坑
{% extends 'base.html'%}
{% block header %}
<h3>'哈哈哈哈,这是一个头'</h3>
{% endblock %}
建url:url('temp/',views.temp)
views函数:
def temp(request):
return render(request, 'home.html', context={'title': 'home'})
访问/app/temp/:
接着我们再创建home_mine.html文件继承home.html
{% extends 'home.html' %}
{% block coutent %}
<h3>哈哈哈你就是这么强大</h3>
{% endblock %}
接着添加url和views:
# url
url('home/', views.home),
# views
def home(request):
return render(request, 'home_mine.html')
我们发现了,原来有的内容,我们都可以继承过来
我们还发现我们在做一个操作时,这个坑出现了第三次,三次以上,默认会覆盖掉原来的内容
但是我们还可以用{{block.super}}调用父类,防止被覆盖
操作:
{% extends 'home.html' %}
{% block coutent %}
<h3>哈哈哈你就是这么强大</h3>
{% endblock %}
{% block header %}
{{ block.super }}
<h4>听说你很good</h4>
{% endblock %}
这样我们就显示了home.html的header,和home_mine.html的header
实践:include+block
创建新html文件include
<h4>本网站受美国法律保护!xxx</h4>
接着我们在home_mine.html中添加
{% block footer %}
{% include 'footer.html' %}
{% endblock %}
静态资源
- 动静分离,逻辑是动态代码,css.html等是静态
步骤:
- 创建静态文件夹
- 在settings中注册 STATICFILES_DIRS=[]
在模板中使用
- 先加载静态资源 {% load static %}
- 使用 {% static 'xxx' %} xxx相对路径
坑点
- 仅在debug模式可以使用
- 以后需要自己单独处理
实践
我们想要给网页中的h3标签添加红色样式,我们可以使用style,但是这样很low,我们可以使用CSS将样式拆分开来
我们可以在父模板对样式挖一个坑,在base.html中添加ext_css的坑:
接着我们在home_mine.html中填坑
{% block ext_css %}
<link rel="stylesheet" href="/static/css/home_mine.css">
{% endblock %}
这时候我们创建static/css文件夹,创建home_mine.css文件:
h3{
color: red;
}
接着我们访问
观察到虽然html中有这个标签,但是h3颜色没有改变
注册css资源
在settings.py中添加:
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
注册静态文件,告诉系统静态资源路径
但是我们/static/css/home_mine.css这种绝对路径写法不提倡,我们用相对路径来写
我们在home_mine中添加
{% load static %}
接着改为:
{% block ext_css %}
{# <link rel="stylesheet" href="/static/css/home_mine.css">#}
<link rel="stylesheet" href="{% static 'css/home_mine.css' %}">
{% endblock %}
这样我们用相对路径方便以后文件变更
此处评论已关闭