Django 模板
2中使用django.http.HttpResponse()来输出“Hello World ! ”。该方式将数据与视图混合在一起,不符合MVT思想,将数据和视图分离。
使用2中项目,继续搭建
初步运用实例
1、新建一个runoob.html文件,放在一个同一文件夹下
2、添加地址 settings中TEMPLATES修改属性’DIRS‘:[os.path.join(BASE_DIR,‘app01’)]
还可修改为:``‘DIRS’:[BASE_DIR,"/模板文件夹名称"]
3、在views中添加视图函数
-----html中的变量与py变量的对应格式
html:{{变量名}}==py:{‘html的变量名’:py的变量名}
4、在url中添加对应关系
效果
注意网址
Django模板标签–基础
变量
模板语法:
views:{"HTML变量名":"views变量名"}
HTML:{{变量名}}
当views中变量为可迭代对象时,可以通过变量.索引的方式进行索引,
如:
#在views中添加代码
from django.shortcuts import render
def runoob(request):
views_list={'name':['kris.wang','eric.tan','enzo.chen','wayne.cao']}
context={"names":views_list}
return render(request,"runoob.html",context=context)
#在url中添加
urlpatterns=[
...
path('runoob/',views.runoob),
]
<!--html-->
...
<body>
<h1>{{names}}</h1>
<h2>{{names.name.0}}</h2>
<h3>{{names.name.1}}</h3>
<h4>{{names.name.2}}</h4>
</body>
...
结果:
过滤器
模板语法:
{{变量名|过滤器:可选参数}}
用法:
1、在变量被显示前修改它,过滤器使用管道字符。
–如{{name|lower}}
,变量name被过滤器lower处理后,文档大写转为文本小写
2、过滤管道可以被“套接”,既是说,一个过滤管道的输出又可以作为下一个管道的输入
–如{{my_list|first|upper}}
,变量my_list将第一个元素转换为大写
3、某些过滤器有参数。过滤器参数跟随冒号之后并且总是以双引号包括。
–如{{bio|truncatewords:"30"}}
,只选取变量bio的前30个词
4、※其他过滤器:9
- addslashes:添加反斜杠到任何反斜杠、单双引号或者双引号前面。
- date:按指定的格式字符串参数格式化date或者datetime对象
–如{{pub_date:date:"F J,Y"}}
- length:返回变量长度,适用于字符串和列表,字典返回的是键值对的数量,集合返回的是去重后的长度。
- default:default为变量提供一个默认值。如果views传的变量对应false时,则使用指定的默认值。
以下数据为false:
0 0.0 False 0j "" '' [] () set() {} None
- filesizeformat:以更易读的方式显示文件的大小(即‘13KB’,‘4.1MB’等),字典返回的是键值对的数量,集合返回的是去重的长度。
- date:根据给定格式对一个日期变量进行格式化,格式
Y-m-d H:i:s
返回年-月-日 小时:分钟:秒
的格式时间。 - truncatechars:如果字符串包含的字符总个数多于指定的字符数量,那么会被截断掉后面的部分,截断的字符串将以
...
结尾 - safe:将字符串标记为安全,不需要转义,使用时要保证后台传来的数据绝对安全才可以使用safe。Django会自动对views传到HTML中的标签语法进行转义,令其语义失效。加safe过滤器是告诉Django该数据是安全的,不必对其进行转义,可以让该数据语义生效。
# views中添加
...
views_str="<a href='https://www.runoob.com/'>点击跳转</a>"
return render(request,"runoob.html",{"views_str":views_str})
...
<body>
{{views_str|safe}}
</body>
结构标签
- if/elif/else/endif标签:
允许使用and or not
{% if 变量1<10 and 变量2>10 %}
执行体1
{% elif 变量1>10 and 变量2<10 %}
执行体2
{% else %}
执行体3
{% endif %}
- for标签
使用情况与python的for循环类似,每一次循环中模板系统会渲染{% for %}
和{% endfor %}
之间的所有内容。
如显示一个列表信息:
<ul>
{% for i in listrange %}<!--在listrange后添加reversed能够反向迭代-->
<li>{{i.xx}}</li>
{% endfor %}
</ul>
<!--遍历字典时:可以直接用字典.items方法,用变量的解包分别获取键和值-->
<!--在循环体内可以通过{{forloop}}变量获取循环序号-->
{% for in listrange %}
{{ forloop.counter}}<!--顺序获取循环序号,从1开始计算-->
{{ forloop.counter0}}<!--顺序获取循环序号,从0开始计算-->
{{ forloop.revcounter}}<!--倒序获取循环序号,结尾序号为1-->
{{ forloop.revcounter0}}<!--倒序获取循环序号,结尾序号为0-->
{{ forloop.first}}<!--(一般配合if标签使用):第一条数据返回True,其他数据返回False-->
{{ forloop.last}}<!--(一般配合if标签使用):最后一条数据返回True,其他数据返回False-->
{% endfor %}
<!--使用结果,假设listrannge=["a","b","c","d","e"]-->
1 2 3 4 5
0 1 2 3 4
5 4 3 2 1
4 3 2 1 0
True False False False False
False False False False True
{% empty %}--从句在{% for %}后添加,当listrange为空时执行
{% for %}标签可嵌套使用
- ifequal/ifnotequal 标签
{% ifequal %}
标签比较两个值,当他们相等时,显示{ % ifequal %}
和{% endifequal %}之中所有的值
{% ifnotequal %}``就是不等
{% ifequal 变量1 变量2 %}
xxx
{% else %}
xxx
{% endifequal %}
- 注释标签
{# 这是一个注释 #}
直接使用<!---->
也可以 - include标签
{% include %}
标签允许在模板中包含其它的模板的内容
{% include "xx.html" %}
- csrf_token标签
用于form表单中,作用是跨站请求伪造保护,如果不用``{% csrf_token %}标签,在用form表单时,再次跳转页面时会报403权限错误。用了该标签,提交数据时才会成功。
解析:
工作流程:
向浏览器发送请求,获取登录页面,此时中间件csrf会自动生成一个隐藏input标签,该标签里的value属性是一个随机的字符串,用户获取到登录页面的同时也获取到了这个隐藏的input标签。然后用户需要用form表单提交数据时,会携带这个input标签一起提交给中间件csrf,(form表单提交数据会将所有input标签提交),crsf接收数据后会判断这个随机字符串是不是它发给用户的,是-则提交成功,否-则失败。
自定义标签和过滤器-重点
步骤:
1、在模板文件同级目录下建立templatetags;(该文件夹名称固定,不可更改)
2、在templatetags目录下创建任意py文件,如:my_tags.py;
3、my_tags.py文件代码
from django import template
register=template.Library()#register的名字是固定的不可改变
4、修改settings中TEMPLATES选项配置,添加libraries配置
...
TEMPLATES=[
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [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',
],
"libraries":{
'my_tags':'templatetags.my_tags' #py文件名对应
}
},
},
]
...
5、利用装饰器@register.filter自定义过滤器(装饰器参数最多只能有两个)
@register.filter#自定义过滤器
def my_filter(v1,v2):
return v1*v2
6、利用装饰器@register.simple_tag自定义标签
@register.simple_tag#自定义标签
def my_tag1(v1,v2,v3):
return v1*v2*v3
7、使用自定义标签和过滤器前需要在html的body的最开始导入该py文件
{% load my_tags %}
8、在HTML中使用自定义过滤器、自定义标签
{{11|my_filter:22}}
{% my_tag1 11 22 33 %}
9、语义化标签
在该py文件中导入mark_safe
from django.utils.safestring import mark_safe
'''定义标签时,用mark_safe方法,令标签语义化,相当于jQuery中的html()方法
和在前端html中使用过滤器safe效果一样
'''
@register.simple_tag
def my_html(v1,v2):
temp_html="<input type='text' id='%s' class='%s'/>"%(v1,v2)
return mark_safe(temp_html)
在html中使用该自定义标签,在页面中动态创建标签
{% my_html "zzz" "xxx" %}
配置静态文件-基础
1、项目根目录下创建statics目录(与manage同级)
2、在settings文件的最下方配置添加以下配置
STATIC_URL='/static/'#别名
STATICFILES_DIRS=[os.path.join(BASE_DIR,"statics"),]
3、statics目录下创建css目录,js目录images目录,plugins目录,分别放css文件,js文件,图片,插件
4、把bootstrap框架放入插件目录plugins
5、在html文件的head标签中引入bootstrap(前端框架)
<link rel="stylesheet" href="/static/plugins/bootstrap.css">
<!--在body添加{% load static %}代码-->
<!--从静态目录中引入图片-->
<img src="{% static 'images/runoob-logo.png' %}" alt="runoob-logo">
模板继承–重点
模板可以用继承的方式来实现复用,减少冗余内容。
网页的头部和尾部内容一般都是一致的,我们就可以通过模板继承来实现复用。
父模板用于放置可重复利用的内容,子模板继承父模板的内容,并放置自己的内容。
父
使用标签block…endblock
{% block 名称 %}
预留给子模版的区域,不同预留区域名称不能相同
{% endblock 名称 %}
子
使用extends继承父模板
子模板如果没有设置父模板预留区域的内容,则使用在父模板设置的默认内容,当然也可以都不设置,就为空。
一旦继承,没有预留区域的子内容都会被洗掉
{% extends "父模板路径"%}
<!--+需要修改的预留区域-->
{% block 名称 %}
内容
{% endblock 名称 %}