8 template俩大功能
9.1 模板继承
9.2 simple_tag
静态文件
网站使用js,css和image都是属于静态文件
1)在项目下创建静态文件目录static 并在下面创建js,css和images目录
2)在settings.py设置静态文件所在的目录路径
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')] ##设置静态文件目录路径
在HTML页面上可以使用标签{% load staticfiles %}加载路径和{% static '路径' %}来动态获得static路径
<!DOCTYPE html>
{% load staticfiles %} {# 加载static路径 #}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<img src="{% static 'images/1.jpg' %}"> {# 动态获取static目录路径 #}
</body>
</html>
过滤器
过滤器是用于对模板变量进行操作
格式:{{ 模板变量 | 过滤器 : 参数 }}
date 更改日期格式
length 求字符串,列表的长度
default 设置模板变量的默认值 当该变量为False返回默认值
更多的模板标签和过滤器及参数可参考官方文档 https://docs.djangoproject.com/zh-hans/2.1/ref/templates/builtins/
自定义过滤器
当Django框架自带的过滤器不能满足你的需求时,可以自定义过滤器。
1)在应用目录下,创建templatetags(名字固定)的Python包,并创建Python文件(名字任意)
2)在Python文件创建对应的过滤器函数
自定义过滤器就是自定义函数。
可以继承两种方式
1)@register.filter它至少有一个参数,最多两个参数。可以在for ,if中使用过滤器
2)@register.simple_tag能传多个参数,但不能在for ,if中使用 调用 {% 过滤器名 参数1 参数2 ... %}
要使用Library类的filter方法来装饰自定义函数 在使用自定义过滤器先要使用{% load 过滤器文件名 %}
filter.py
from django.template import Library #该类用于装饰你的过滤器
register = Library() #实例化 名字固定
#该对象的filter方法让我们函数变为自定义过滤器
@register.filter
def mod(num):
#判断num是否为偶数
return num%2 == 0
@register.filter
def mod_val(num,val):
#判断num是否能给val整除
return num%val == 0
index.html
<!DOCTYPE html>
<html lang="en">
{% load filter %} {# 加载自定义过滤器的文件 #}
<head>
<meta charset="UTF-8">
<title>图书信息</title>
</head>
<body>
<a href="/create">新增</a>
<ul>
{% for book in books %}
{% if book.id|mod_val:3 %} {# 把book.id作为参数给自定义的过滤器 #}
<li>{{ book.btitle }}--{{ book.id }}--<a href="/delete{{ book.id }}">删除</a></li>
{% endif %}
{% endfor %}
</ul>
</body>
</html>
模板继承
多个相同部分的页面,为了减少代码块的使用,可以使用模板继承。
父模板中可以定义块预留位置
{% block 块名 %}
内容可写,也可不写
{% endblock 块名 %}
子模板继承父模板,也可以重写模板中块的内容 在块中可以使用{{ block.super }}来获取父模板中的块内容
{% extends 父模板路径 %}
{% block 块名 %}
内容重写
{% endblock 块名 %}
父模板base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}父模板{% endblock title %}</title>
</head>
<body>
<h1>导航条</h1>
{% block b1 %}
<h4>父模板内容</h4>
{% endblock b1 %}
<h1>底部</h1>
</body>
</html>
子模板child.py
{% extends 'booktest/base.html' %} {# 继承父模板 路径相对于templaes目录 #}
{% block title %}子模板{% endblock title %} {# 更改标题块 #}
{% block b1 %} {# 更改b1块 #}
{{ block.super }} {# 获取父模板b1块中的内容 #}
<h4>子模板内容</h4>
{% endblock b1 %}