Django学习笔记之模板功能
简介:
在Django中模板主要就是前端展示页面,除了写一些HTML、css、JavaScript代码之外,我们还可以使用“模板”功能,将后台传过来的数据进行处理后,在显示在页面上。
模板功能主要分为标签和过滤器,主要的表现形式为 {{ }} 和 {% %},变量相关用 {{ }},逻辑相关用{% %}。
一、标签
标签又分为 内置标签 和 自定义标签 两种。
1、内置标签
这里只列举一些常用的内置标签,其他的标签可以跳转到内置标签。
csrf_token
这个标签用于跨站请求伪造保护,在form表单里面加上{% csrf_token %},可以通过Django的跨站请求伪造的保护。
注释
使用{# #}来填写注释内容。
block、extend、include
都是用在模板继承里面,下面会介绍。
for
循环遍历数组、字典的值。
例如:
<ul>
{% for student in studetn_list %}
<li>{{ student.name }}</li>
{% endfor %}
</ul>
如果想要反向循环列表的话,可以使用reversed关键字,{% for student in studetn_list reversed %}。
如果是字典的话,还可以直接取出字典的键和对应的值:
{% for key,value in dict_list %}
{{key}}:{{value}}
{% endfor %}
这里遍历字典的话,需要注意一下,如果该字典的某个键的名称同时又是字典的某个方法名(比如:items),那么使用data.items将
返回的是items这个键在字典中对应的值,而不是data.items()这个方法返回的内容,归纳为:点运算符(.)的字典键查找优先于方法查找。
for循环还可以使用内置的一些参数:
| Variable | Description |
| forloop.counter | 当前循环的索引值(从1开始) |
| forloop.counter0 | 当前循环的索引值(从0开始) |
| forloop.revcounter | 当前循环的倒序索引值(从1开始) |
| forloop.revcounter0 | 当前循环的倒序索引值(从0开始) |
| forloop.first | 当前循环是不是第一次循环(布尔值) |
| forloop.last | 当前循环是不是最后一次循环(布尔值) |
| forloop.parentloop | 本层循环的父循环 |
for........empty 如果返回的结果为空或者无法找到,则会运行 {% empty %}。
<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% empty %} <li>Sorry, no athletes in this list.</li> {% endfor %} </ul>
if
输出符合条件的内容:
{% if athlete_list %}
Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
Athletes should be out of the locker room soon!
{% else %}
No athletes.
{% endif %}
if标签支持:and、or、not、in、not in 、is、is not、==、!=、>、<、>=、<=。
with
以更简单的名称来代替复杂的变量名称。
{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
2、自定义标签(简单标签和包含标签)
简单标签(simple_tag):
a、在应用下面新建一个文件夹templatetags,在文件夹下面新建自定义标签的py文件。

b、编写你的simple_tag要实现的功能代码:
from django import template #导入Django的template模块 register = template.Library() # 实例化模板的Library类 @register.simple_tag(name='current_time') # 注册该方法为simple_tag def your_name(name): return "This is {}".format(name)
c、在模板文件中调用自定义的标签:
{% load app01_simpletags %} {# 载入你的自定义标签文件 #}
{# 自定义的simple_tag 并传入参数 #}
<h1>{% your_name '三炮' %}</h1>
包含标签(inclusion_tags)
inclusion_tags多用于返回一段HTML代码。
a、在上面建的文件夹templatetags下,新建一个py文件;
b、编写自定义inclusion_tags代码:
from django import template #导入Django的template模块 register = template.Library() #实例化一个Library类 @register.inclusion_tag('3.html') #绑定一个HTML代码片段 def num_list(n): n = 1 if n<1 else int(n) data_list = ["This is {}".format(i) for i in range(1,n+1)] return {'data_list':data_list} #返回结果给绑定的HTML代码段
c、编写需要绑定的HTML代码片段:
<ul> {% for choice in data_list %} {# 这个data_list 指的是返回的键值对中的键 #} <li>{{ choice }}</li> {% endfor %} </ul>
d、在模板中使用 inclusion_tags:
{% load app01_inclusiontags %} {# 载入你的自定义标签文件 #}
{# 调用自定义的inclusion_tag 并传入参数 #}
{% num_list 6 %}
二、过滤器
1、内置过滤器
default
{{ value|default 'nothing' }},如果value没有值的话,就显示nothing。
length
{{value|length}},返回value的长度。
filesizeformat
{{value|filesizeformat}}将一个人类可读的值格式化为一个表示文件大小的格式,比如:如果value是123456789,则输出为117.7MB。
slice
{{value|slice:'0:2'}}返回一个切片后的值,切片规则和python一样。
date
{{value|date:"格式字符串"}} 根据格式字符串格式化日期。
一般使用的格式为{{value|date:"Y-m-d H:i:s"}},其他可用的"格式字符串"可以查看格式化字符串。
safe
为了安全起见,Django默认不会将后台传过来的包含HTML格式的值自动转化HTML,如果想将包含HTML代码的值转化,有要用safe。
{{value|safe}} 例如:value的值为"<p>123</p>"。
truncatechars
如果后台传过来的值太长,不想全部都展示到前台的话,可以使用这个过滤器,将不想显示的部分用省略号来代替。
{{value|truncatechars:9}} 这个是只显示value长度为9的内容,其他内容用省略号来代替。
其他的内置过滤器可以去看Django内置过滤器参考。
2、自定义过滤器
创建自定义过滤器的步骤和上面创建自定义标签的步骤差不多,需要注意的是自定义的过滤器只能接收一个或者两个参数(其中
第一个参数是使用这个过滤器的变量,第二个参数是需要传的参数),而自定义标签可以接收多个参数。
a、在新建的文件夹templatetags下,新建一个py文件;
b、编写自定义过滤器的代码:
from django import template # 导入Django的template模块 register = template.Library() # 实例化一个Library类 @register.filter(name='cut') # 注册为一个过滤器并命名 def cut(value, arg): return value.replace(arg, 'hahaha') @register.filter # 注册为一个过滤器不命名,默认使用函数名 def lower1(value): return value.lower();
c、在模板中使用自定义的过滤器:
{% load app01_filter %} {# 载入你的自定义标签文件 #}
{# 调用自定义的过滤器 并传入参数 #}
<h1>{{ somevariable|cut:'some' }}</h1>
{# 调用自定义的过滤器 ,只有当前变量作为参数 #}
<h1>{{ THISISRIGHT|lower1 }}</h1>
三、母板
为了避免写重复的代码,所以再写模板的时候,我们会使用母板,主要就是把重复的部分摘出来单独放在一个文件里,然后让其余
文件去调用。
在母板文件中,我们主要使用的标签是block,主要就是在子板继承的时候,能够自定义不同的部分。比如我们如下定义的Base.html:
<!DOCTYPE html> <html lang="en"> <head> <link rel="stylesheet" href="style.css"> <title>{% block title %}My amazing site{% endblock %}</title> </head> <body> <div id="sidebar"> {% block sidebar %} <ul> <li><a href="/">Home</a></li> <li><a href="/blog/">Blog</a></li> </ul> {% endblock %} </div> <div id="content"> {% block content %}{% endblock %} </div> </body> </html>
那么,子板在继承母板的时候,需要这样写:
{% extends "base.html" %} #声明要继承的母板
{% block title %}My amazing blog{% endblock %} #替换了title里面的内容
#sidebar没有重写,所以继承了母板的内容
{% block content %} #填充了content里面的内容
{% for entry in blog_entries %}
<h2>{{ entry.title }}</h2>
<p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}
我们还可以把单独的一个功能封装到一个文件里,然后让其他的文件来直接调用:
{% include 'navbar.html' %} #使用include标签来调用其他的文件
四、静态文件路径的其他写法
1、直接写路径
<script type="text/javascript" src="/static/jquery-3.3.1.js"></script> <script type="text/javascript" src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
2、加载静态文件存放的文件夹
{% load static %}
<script type="text/javascript" src="{% static "jquery-3.3.1.js" %}"></script>
<script type="text/javascript" src="{% static "bootstrap-3.3.7/js/bootstrap.min.js" %}"></script>
3、如果某个文件被用到多次,可以给它一个名字
{% load static %}
{% static "jquery-3.3.1.js" as jquery %}
<script type="text/javascript" src="{{ jquery }}"></script>
4、使用get_static_prefix来获取路径
{% load static %}
<script type="text/javascript" src="{% get_static_prefix %}jquery-3.3.1.js"></script>
或者
{% load static %}
{% get_static_prefix as static_prefix %}
<script type="text/javascript" src="{{ static_prefix }}jquery-3.3.1.js"></script>

浙公网安备 33010602011771号