模板Templates
模板Templates
一、模板概述与配置
1、概述
模板是HTML页面 根据后台数据传递进行动态填充页面
2、配置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
3、目录层级
project/
App/
templates/
4、配置模板目录
选择templates->mark directory->template folder
二、模板的使用
1、渲染模板
- render 直接渲染模板
- render_to_string 返回渲染模板后的内容
2、传递变量
视图函数中
def test_tem(req):
args = {'title': '首页'}
return render(req, 'index.html', args)
将字典args传递模板中进行渲染
模板中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
<h1>首页</h1>
</body>
</html>
3、分类
模板中分为
- 变量
- 标签
4、注意
如果在模板中使用了不存在的变量 则插入空白符号(啥都没有)
三、标签
1、说明
在模板中 {% 标签名 %} 称为标签
2、if标签
操作符:
== != > >= < <= and or in not in not
算数语运算符不允许使用
- 单一分支
{% if ... %}
... - 双向条件分支
{% if ... %}
...
{% else %}
... - 多向条件分支
{% if ... %}
...
{% elif %}
...
{% else %}
...
支持if嵌套
3、for标签
-
说明
与python中的for 使用方式一样 for in -
格式
不搭配empty
{% for var in seq %}
...
{% endfor %}
搭配empty
{% for var in seq %}
...
{% empty %}
... -
使用
{% for k in info %}
- {{ k }}
{% for k,v in info.items %}
<li>{{ k }}====={{ v }}</li>
{% endfor %}
empty
{% for k in xxx %}
{% empty %}
{% endfor %}
循环的变量不存在 执行empty
4、ifequal/ifnotequal 标签
-
作用
判断是否相等/不相等 -
格式
{% ifequal 表达式1 表达式2 %}
...
{% else %}
...{% ifnotequal 表达式1 表达式2 %} ... {% else %} ... {% endifnotequal %} -
实例
{% ifequal 'l' 'a' %}
<li>为真</li>
{% else %}
<li>为假</li>
{% endifequal %}
{% ifnotequal 'l' 'a' %}
<li>为真</li>
{% else %}
<li>为假</li>
{% endifnotequal %}
5、注释标签
- 说明
- 代码调试
- 解释说明
- 单行注释
- 多行注释
6、include导入标签
- 说明
include 语句可以把一个模板引入到另一个模板中 类似于 把一个模板的代码copy到当前指定的位置 - 目录结构
project/
templates/
common/
header.html
footer.html - 使用
点击查看代码
test_include.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
body{
padding: 0;
margin: 0;
}
header{
width: 100%;
height: 150px;
background-color: #000;
color: #fff;
font-size: 40px;
}
footer{
width: 100%;
height: 150px;
background-color: #000;
color: #fff;
font-size: 40px;
position: absolute;
bottom: 0;
}
</style>
</head>
<body>
{% include 'common/header.html' %}
<h1>测试include方法</h1>
{% include 'common/footer.html' %}
</body>
</html>
common/header.html
<header>
头部
</header>
common/footer.html
<footer>
底部
</footer>
视图函数
# 测试导入标签
def test_include(req):
return render(req, 'test_include.html')
7、模板继承
-
概述
django中的模板可以继承的 通过继承可以将 页面中许多元素 抽取出来 放在父母版中 父母版中 通过block标签 进行标记 在子模板中实现替换 -
作用
实现页面代码的复用 减少重复代码 -
标签
- 继承标签
- 模板替换
-
使用
common/base.html
{% block head %}
{% block meta %}{% endblock %}
{% block title %}Title{% endblock %}
{% block link %}{% endblock %}
{% block script %}{% endblock %}
{% endblock %}
{% endblock %} </body> </html>test_base.html
{% extends 'common/base.html' %}
{% block title %}
{{ block.super }}
首页
{% endblock %}
{% block con %}
首页
{% endblock %}
视图
def test_base(req):
return render(req, 'test_base.html') -
注意:如果子模板替换了父母版 还想显示原来的内容 {{ block.super }}
8、include与extend区别
- 相同点
均实现了代码的重用 - 不同点
包含是将目标文件整个渲染出来
继承的本质是代码的替换 一般用来实现页面中重复不变的区域
9、模板中动态构造路由地址
配置
project/urls.py
urlpatterns = [
path('', include(('App.urls', 'App'), namespace='App')),
]
App/urls.py
path('base/', index.test_base, name='test_base'),
path('args/<name>/<age>/', index.args, name='args'),
模板中进行构造
<h3>构造路由地址</h3>
<ul>
<li>{% url 'App:test_base' %}</li>
<li><a href="{% url 'App:test_base' %}" target="_blank">test_base</a></li>
<li>{% url 'App:args' 'lucky' 18 %}</li>
<li>{% url 'App:args' name='lucky' age=18 %}</li>
<li>{% url 'App:args' name='lucky' age=18 %}?name=lucky&age=18</li>
</ul>
10、django使用bootstrap
-
安装
pip install django-bootstrap3 -
配置
INSTALLED_APPS = [
...
'App',
'bootstrap3',
] -
index.html
{% extends 'bootstrap3/bootstrap3.html' %}
{% block bootstrap3_content %}
11、csrf跨站请求伪造
- 说明
某些恶意的网站上包含链接、表单按钮js代码 他们会利用你登陆过的信息视图在你的网站上完成某些操作 这就是跨站攻击 - 作用
在页面中生成csrf token的cookie
在页面中生成csrf的隐藏域
用于跨站请求伪造保护 - 原理
请求会带着cookie和隐藏域的值 访问服务器 服务器端根据cookie和表单隐藏域的值 进行对比 如果对比成功则通过 否则拒绝请求 403
12、autoescape 标签
- 作用
HTML转义标签 - 使用
开启转义(默认转义)
{% autoescape on %}
{{ con }}
{% endautoescape %}
关闭转义
- 过滤关闭转义
四、过滤器
1、说明
- 格式
- 作用
在变量显示前进行修改
2、内置过滤器
-
first 获取第一个成员
-
last 获取最后一个成员
-
lower 转换为小写
-
upper 转换为大写
-
cut 查找删除指定字符
-
default 默认值
-
escape 转换为实体符号标签
-
floatformat 保留小数 {{1.2345|floatformat:2}}
-
length 返回长度
-
random 返回随机项
-
join 字符串拼接
-
striptags 取出标签
- {{ 'abcd'|first }}
- {{ 'abcd'|last }}
- {{ 'abAHGHJcd'|lower }}
- {{ 'abAHGHJcd'|upper }}
- {{ 'abAHGHJcd'|upper|first }}
- {{ 'abcd'|cut:'a' }}
- {{ abc|default:'default' }}
- {{1.2345|floatformat:2}}
- {{ 'abcd'|length }}
- {{ 'abcd'|random }}
- {{ List|join:',' }}
- {{ 'b标签'|striptags }}
3、自定义过滤器
-
目录结构
project/
App/
templatetags/ 名字固定的
init.py
mytag.py 自定义的文件 -
mytags.py
from django import template
register = template.Library() # 实例化对象# 自定义过滤器 # 如果起别名 则使用 @register.filter('sum_filter') @register.filter # @register.filter('sum_filter') def sum_filter(x, y): return x + y # 自定义标签 # @register.simple_tag() @register.simple_tag def sum_tag(x, y): return x + y -
模板中使用
- {{ 'b标签'|striptags }}
- 自定义过滤器
- {{ 1|sum_filter:1 }}
- 自定义标签
- {% sum_tag 1 2 %}
五、静态文件
1、说明
网站通常需要提供其它文件 比如图片、css、js 在django中我们称为静态文件
2、作用
管理静态文件
3、目录结构
project/
App/
templates/
static/
css/
js/
img/
4、配置静态文件
- INSTALL_APPS 中 'django.contrib.staticfiles',
- 设置url
STATIC_URL = '/static/'
5、使用
点击查看代码
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static 'css/test.css' %}">
</head>
<body>
<h1>测试静态文件</h1>
</body>
</html>
本文来自博客园,作者:寻月隐君,转载请注明原文链接:https://www.cnblogs.com/QiaoPengjun/articles/15947033.html

浙公网安备 33010602011771号