django 模版渲染
[toc]
4.模版渲染
4.1 settings文件配置
settings配置文件中的TEMPLATES项是对静态页面的设置,DIRS处需要写上对应的静态文件存放的位置,默认为templates
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',
],
},
},
]
4.2 模版语法
在html文件标签中写
{{ 变量 }} {% 逻辑 %}
4.3 万能的点 .
html文件
以下代码中dic.name就是.的运用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{ num }}</h1>
<h1>{{ str }}</h1>
<h1>{{ lst }}</h1>
<h1>{{ dic.name }}</h1>
{# #注意,调用方法时,不能加括号,所有如果方法带参数,就没法用了#}
<h1>{{ woman.play }}</h1>
<h1>{{ woman.xx }}</h1>
</body>
</html>
views文件
from django.shortcuts import render,HttpResponse,redirect
from django.views import View #CBV进程的类
# Create your views here.
def home(request):
# return HttpResponse('登陆成功')
# return render(request,'index.html')
num = 10
str = 'I am a running 的草泥马'
lst = [1,2,3,4,5,6]
dic = {'name':'小明','age':20}
class A:
money = 100
def __init__(self):
self.xx = 'oo'
def play(self):
return '什么价位?'
woman = A()
return render(request,'模版渲染.html',{'num':num,'str':str,'lst':lst,'dic':dic,'woman':woman})
运行后的初次效果

4.4 过滤器
4.4.1 过滤器用法
有参数的过滤器用法
{{ 变量|过滤器名称:'参数' }}
没参数的过滤器用法
{{ 变量|过滤器名称 }}
4.4.2 内置过滤器
views文件
from django.shortcuts import render,HttpResponse,redirect
from django.views import View #CBV进程的类
# Create your views here.
def home(request):
# return HttpResponse('登陆成功')
# return render(request,'index.html')
num = 10
str = 'I am a running 的草泥马'
lst = [1,2,3,4,5,6]
dic = {'name':'小明','age':20}
class A:
money = 100
def __init__(self):
self.xx = 'oo'
def play(self):
return '什么价位?'
woman = A()
return render(request,'模版渲染.html',{'num':num,'str':str,'lst':lst,'dic':dic,'woman':woman})
4.4.2.1 truncatechars 截断字符串
truncatechars:数字 数字表示要截断的字符数
未截断前

截断后
truncatechars:5表示截取5个字符,其中包括3个.
<h1>{{ str | truncatechars:5 }}</h1>

4.4.2.2 default 如果一个变量是false或者为空,使用给定的默认值。 否则,使用变量的值
在views文件中只有num变量,没有num1变量,因此使用default指定的值
<h1>{{ num1 | default:'没有num1这个变量' }}</h1>

4.4.2.3 length 获取变量数据长度
<h1>{{ lst | length }}</h1>
4.4.2.4 filesizeformat 大小按照人类可读方式显示
views文件中定义file_size = 1024,注意还需要在render方法中以字典的形式定义返回
<h1>{{ file_size | filesizeformat }}</h1>

4.4.2.5 slice 切片(顾头不顾腚)
<h1>{{ str | slice:'2:9' }}</h1>

使用切片截取

4.4.2.6 date 日期格式化显示
views文件
import datetime
now = datetime.datetime.now()
注意在render方法中返回
html文件
<h1>{{ now | date:'Y-m-d H:i:s' }}</h1>

4.4.2.7 safe 关闭HTML的自动转义
safe是防止xss攻击让一些js、html等等代码变成普通字符而不执行,但有的时候我们想要执行这些代码,就需要用到safe
Django的模板中在进行模板渲染的时候会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全,django担心这是用户添加的数据,比如如果有人给你评论的时候写了一段js代码,这个评论一提交,js代码就执行啦,这样就可以搞一些坏事儿了,写个弹窗的死循环,浏览器会一直弹窗,这叫做xss攻击,所以浏览器不让你这么搞,给你转义了。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过 过滤器"|safe" 的方式告诉Django这段代码是安全的不必转义。
views文件中定义了一个a_tag,我门现在就想让这个标签成为一个超链接
a_tag = "<a href='http://www.baidu.com'>百度</a>"
html文件
<h1>{{ a_tag | safe }}</h1>
没有加safe

加上safe后

4.4.2.8 join 字符串拼接列表
views文件
lst = [1,2,3,4,5,6]
html文件
<h1>{{ lst | join:"+"}}</h1>

4.4.2.9 cut 移除变量中所有的与给出的变量相同的字符串
views文件
str = 'I am a running 的草泥马'
html文件
<h1>{{ str | cut:' ' }}</h1>

4.5 标签
4.5.1 for标签
for标签语法
{% for foo in 循环的对象 %}
{% endfor %}
for标签循环列表简单示例
views文件
def home(request):
lst = [1,2,3,4,5]
return render(request,'home.html',{'lst':lst})
html文件
<body>
<ul>
{% for foo in lst %}
<li>{{ foo }}</li>
{% endfor %}
</ul>
</body>
结果如下

<body>
<ul>
{% for foo in lst reversed %}
<li>{{ foo }}</li>
{% endfor %}
</ul>
</body>

for标签循环字典简单示例
views文件
def home(request):
lst = [1,2,3,4,5]
dic = {'name':'小明','age':20,'hobby':'唱、跳、rap、篮球'}
return render(request,'home.html',{'lst':lst,'dic':dic})
html文件
<ol>
{% for foo in dic.items %} //这里可以循环字典的键、值、键和值
<li>{{ foo }}</li>
{% endfor %}
</ol>
<ol>
{% for key,value in dic.items %}
<li>{{ key }}--->{{ value }}</li>
{% endfor %}
</ol>


for标签中的empty
{% for i in lst1 %} #当没有数据时,会生成empty的内容
<li>{{ i }}</li>
{% empty %}
<p>啥数据也没有!</p>
{% endfor %}
for标签中的forloop方法,必须在循环内使用
forloop.counter #当前循环的索引值(从1开始),forloop是循环器,通过点来使用功能
forloop.counter0 #当前循环的索引值(从0开始)
forloop.revcounter #当前循环的倒序索引值(从1开始)
forloop.revcounter0 #当前循环的倒序索引值(从0开始)
forloop.first #当前循环是不是第一次循环(布尔值)
forloop.last #当前循环是不是最后一次循环(布尔值)
forloop.parentloop #本层循环的外层循环的对象,再通过上面的几个属性来显示外层循环的计数等
forloop.counter #当前循环的索引值(从1开始),forloop是循环器,通过点来使用功能
<ol>
{% for key,value in dic.items %}
<li>{{ forloop.counter }}{{ key }}--->{{ value }}</li>
{% endfor %}
</ol>

forloop.counter0 #当前循环的索引值(从0开始)
<ol>
{% for key,value in dic.items %}
<li>{{ forloop.counter0 }}{{ key }}--->{{ value }}</li>
{% endfor %}
</ol>

forloop.first #当前循环是不是第一次循环(布尔值)
<ol>
{% for key,value in dic.items %}
<li>{{ forloop.first }} {{ key }}--->{{ value }}</li>
{% endfor %}
</ol>

forloop.parentloop #本层循环的外层循环的对象,再通过上面的几个属性来显示外层循环的计数等
views文件
def home(request):
lst = [1,2,3,4,5]
dic = {'name':'小明','age':20,'hobby':['唱','跳','rap','篮球']}
return render(request,'home.html',{'lst':lst,'dic':dic})
html文件
<ol>
{% for key,value in dic.items %}
<li>{{ forloop.last }} {{ key }}--->{{ value }}</li>
{% for foo in dic.hobby %}
{{ forloop.parentloop.counter }}---{{ forloop.counter }}<a href="">{{ foo }}</a>
{% endfor %}
{% endfor %}
</ol>

4.5.2 if标签
if语句支持
and、or、==、>、<、!=、<=、>=、in、not in、is、is not判断,注意条件两边都有空格
views文件
def home(request):
num = 100
str = 'helow'
lst = [1,2,3,4,5]
dic = {'name':'小明','age':20,'hobby':'唱、跳、rap、篮球'}
return render(request,'home.html',{'lst':lst,'dic':dic,'num':num,'str':str})
html文件
普通判断
{% if num == 100 %}
<p>数字等于100</p>
{% else %}
<p>数字不等于100</p>
{% endif %}
#语法
{% if %}
{% elif %}
{% else %}
{% endif %} //以endif结尾
结合过滤器使用
{% if str|length == 5 %}
<p>字符串长度为5</p>
{% endif %}