views.py内创建的字典的 key,value:{"HTML模板的变量名" : "要给变量赋的值"} HTML模板:{{变量名}}
列表
模板文件可以用 . 索引下标取出对应的元素。
case/index/views.py 文件代码:
from django.shortcuts import render def index(request): views_list = ["列表元素一","列表元素二","列表元素三"] return render(request, "index.html", {"views_list": views_list})
模板文件内文件代码:
<p>{{ views_list }}</p> # 取出整个列表 <p>{{ views_list.0 }}</p> # 取出列表的第一个元素
然后访问自己指定的网址,默认为 http://127.0.0.1:8000/index/
获取响应数据。
字典
模板文件可以用 .key 取出对应的值。
case/index/views.py 文件代码:
from django.shortcuts import render def index(request): views_dict = {"name":"我是name键的value"} return render(request, "index.html", {"views_dict": views_dict})
模板文件内文件代码:
<p>{{ views_dict }}</p> -- 获取整个字典的内容 <p>{{ views_dict.name }}</p> -- 获取字典内name键的值
然后访问自己指定的网址,默认为 http://127.0.0.1:8000/index/
来获取响应。。
过滤器
模板语法:
{{ 变量名 | 过滤器:可选参数 }}
模板文件可以用 .key 取出对应的值。
case/index/views.py 文件代码:
from django.shortcuts import render def index(request): views_dict = {"name":"我是name键的value"} return render(request, "index.html", {"views_dict": views_dict})
模板文件内文件代码:
<p>{{ views_dict }}</p> -- 获取整个字典的内容 <p>{{ views_dict.name }}</p> -- 获取字典内name键的值
然后访问自己指定的网址,默认为 http://127.0.0.1:8000/index/
来获取响应。。
case/index/views.py 文件代码:
from django.shortcuts import render def index(request): views_list = ["one",'two','THREE'] return render(request, "index.html", {"views_list": views_list})
模板过滤器可以在变量被显示前修改它,过滤器使用管道字符,如下所示:模板文件代码:
# 过滤管道可以被* 套接* ,既是说,一个过滤器管道的输出又可以作为下一个管道的输入: <p>{{ views_list|first|upper }}</p> -- 过滤器拿到第一位list值将其转化成大写 <p>{{ views_list.2|lower }}</p> -- 过滤器拿到下标为2的元素的list值将其转化成小写、0为第一位
然后访问自己指定的网址,默认为 http://127.0.0.1:8000/index/
case/index/views.py 文件代码:
from django.shortcuts import render def index(request): views_dict = {"name":"一 二 三 四 五"} return render(request, "index.html", {"views_dict": views_dict})
模板文件内文件代码:
有些过滤器有参数。 过滤器的参数跟随冒号之后并且总是以双引号包含。 例如:
<p>{{ views_dict.name|truncatewords:"3" }}</p> -- 过滤器以到空格为一个词获取dict.name的值的前三个词
然后访问自己指定的网址,默认为 http://127.0.0.1:8000/index/
case/index/views.py 文件代码:
from django.shortcuts import render def index(request): return render(request, "index.html", {"name": 0 })
模板文件内文件代码:默认值
<p>{{ name|default:"我是默认值" }}</p> -- 为变量提供一个默认值。如果 views 传的变量的布尔值为 false,则使用指定的默认值。 为空,为0,的值都为flase
然后访问自己指定的网址,默认为 http://127.0.0.1:8000/index/
求长度-- length
case/index/views.py 文件代码:
from django.shortcuts import render def index(request): return render(request, "index.html", {"name": "这是五个字" })
模板文件内文件代码:
<h1>{{ 变量名|length}}</h1> -- 返回对象的长度,适用于字符串和列表。字典返回的是键值的数量,集合返回的是去重后的长度。
然后访问自己指定的网址,默认为 http://127.0.0.1:8000/index/
显示文件的大小:filesizeformat
case/index/views.py 文件代码:
from django.shortcuts import render def index(request): return render(request, "index.html", {"name": 1024 })
模板文件内文件代码:
<p>{{ num|filesizeformat}}</p> -- 将数值转化成易懂的文件大小值- 434.0 KB
然后访问自己指定的网址,默认为 http://127.0.0.1:8000/index/
时间显示-- data
case/index/views.py 文件代码:
from django.shortcuts import render def index(request): import datetime now = datetime.datetime.now() return render(request, "index.html", {"time": now})
模板文件内文件代码:
<p>{{ time|date:"Y-m-d H:i:s" }}</p> -- Y-m-d H:i:s返回 年-月-日 小时:分钟:秒 的格式时间。
然后访问自己指定的网址,默认为 http://127.0.0.1:8000/index/
限制可显示的字符个数: truncatechars
case/index/views.py 文件代码:
from django.shortcuts import render def index(request): return render(request, "index.html", {"views_str": "一二三四"})
模板文件内文件代码:
<p>{{ views_str|truncatechars:2}}</p> -- 限制改变量可传入的字符个数,大于会被截断。截断的字符串将以 ... 结尾
然后访问自己指定的网址,默认为 http://127.0.0.1:8000/index/
接收可执行代码: safe
Django 会自动对 views.py 传到HTML文件中的标签语法进行转义,令其语义失效。加 safe 过滤器是告诉 Django 该数据是安全的,不必对其进行转义,可以让该数据语义生效。
case/index/views.py 文件代码:
from django.shortcuts import render def index(request): views_str = "<a href='https://www.runoob.com/'>点击跳转</a>" return render(request, "runoob.html", {"views_str": views_str})
模板文件内文件代码:
<p>{{ views_str|safe }}</p> -- 将传进来的语句设为安全-可执行的,不对其进行转义操作,如:"<a href='https://www.runoob.com/'>点击跳转</a>"替换变量,点击就会跳转,相当于在变量位置插入一段这个可执行代码
然后访问自己指定的网址,默认为 http://127.0.0.1:8000/index/
判断语句: if -- elif -- else -- endif
条件判断语句:{% if %} 标签接受 and , or 或者 not 关键字来对多个变量做判断 基本和python的if语句相同,支持嵌套 {%if num > 90 and num <= 100 %} 优秀 {% elif num > 60 and num <= 90 %} 合格 {% else %} 一边玩去~ {% endif %} -- 结束 if 语句
循环语句: for -- endfor
循环语句: 循环语句可支持嵌套循环和python一样 {% for i,j in views_dict.items %} <h1>{{ i }}</h1> <ul> {% for sport in j reversed %} -- 加个 reversed 可将列表反向循环,最后一个变第一个 <li>{{ sport }}</li> {% endfor %} -- 结束 for 语句 </ul> {% endfor %} -- 结束 for 语句
可选的 {% empty %} 从句
{% empty %} -- 可通过该条语句判断其值内有没有值,当其值为空时html上就显示"空空如也"
{% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。
{% ifequal section 'sitenews' %} <h1>Site News</h1> {% else %} <h1>No News Here</h1> {% endifequal %}
模板内嵌入另一个模板: include
{% include "nav.html" %} -- {% include %} 标签允许在模板中包含其它的模板的内容。
<h1>{{ 变量名|addslashes }}</h1> -- 添加反斜杠到任何反斜杠、单引号或者双引号前面。
{# #} 或 ctrl + / -- 单行注释
csrf_token 如果不用 {% csrf_token %} 标签,在用 form 表单时,要再次跳转页面会报 403 权限错误。 用了{% csrf_token %} 标签,在 form 表单提交数据时,才会成功。 {% csrf_token %} 首先,向服务器发送请求,获取登录页面,此时中间件 csrf 会自动生成一个隐藏input标签, 该标签里的 value 属性的值是一个随机的字符串,用户获取到登录页面的同时也获取到了这个隐藏的input标签。 然后,等用户需要用到form表单提交数据的时候,会携带这个 input 标签一起提交给中间件 csrf, 原因是 form 表单提交数据时,会包括所有的 input 标签,中间件 csrf 接收到数据时,会判断, 这个随机字符串是不是第一次它发给用户的那个,如果是,则数据提交成功,如果不是,则返回403权限错误。
自定义过滤器,以及标签:
1.在项目根目录下创建一个templatetags 目录2、在 templatetags 目录下创建任意 py 文件,如:my_tags.py。
3、my_tags.py 文件代码如下:
from django import template register = template.Library() #register的名字是固定的,不可改变
4.修改 settings.py 文件的 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' # 添加这边三行配置 } # 添加这边三行配置 }, }, ]
4、在使用自定义标签和过滤器前,要在 html 文件 body 的最上方中导入该 py 文件。
{% load my_tags %}
4、利用装饰器 --- @register.filter --- 自定义 过滤器。
注意:装饰器的参数最多只能有 2 个。
@register.filter def my_filter(v1, v2): return v1 * v2
4.1、在 HTML 中使用自定义过滤器。
{{ 11|my_filter:22 }}
5、利用装饰器 --- @register.simple_tag --- 自定义 标签。
定义标签时,用上 mark_safe 方法,令标签语义化(将其转为可执行代码),和 HTML文件中的过滤器 safe 效果一样。
语义化标签 -- 。在 my_tags.py 文件中导入 mark_safe。
from django.utils.safestring import mark_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)
5.1 在HTML中使用该自定义标签,在页面中动态创建标签。
{% my_html "zzz" "xxx" %}
传给my_html函数两个值,让其替换语句内的内容,再将可执行语句通过 mark_safe转发给模板,填充后响应给用户
模板语法url的参数设置与路由定义是相互关联的:
若路由地址存在变量,则模板语法url需要设置响应的参数值,参数值之间使用空格隔开。 若路由地址不存在变量,则模板语法url只需设置路由命名name即可,无须设置额外的参数。 若路由地址的变量与模板语法url的参数数量不相同,则在浏览器访问网页的时候会提示NoReverseMatch at的错误信息