基本使用
编写模板
runoob.html
<h1>{{ hello }}</h1>
使用模板
from django.shortcuts import render
def runoob(request):
context = {}
context['hello'] = 'Hello World!'
return render(request, 'runoob.html', context)
使用参数
变量
{{ name }}
列表
{{ views_list }}
{{ views_list.0 }}
字典
{{ views_dict.name }}
过滤器
语法
{{ 变量名 | 过滤器:可选参数 }}
示例
{{ name|lower }}
可以套接
{{ my_list|first|upper }} // 一个过滤器管道的输出又可以作为下一个管道的输入
常见过滤器
-
lower
-
upper
-
addslashes
添加反斜杠到任何反斜杠、单引号或者双引号前面
-
date
显示格式化date或datetime对象
{{ pub_date|date:"Y-m-d H:i:s" }}
-
lenth
返回变量长度
-
default
{{ name|default:"菜鸟教程666" }}
-
truncatechars
如果字符串包含的字符总个数多于指定的字符数量,那么会被截断掉后面的部分
{{ views_str|truncatechars:2}}
-
safe
不需要转义
if/else
{% if condition %}
... display
{% endif %}
{% if condition1 %}
... display 1
{% elif condition2 %}
... display 2
{% else %}
... display 3
{% endif %}
接收and
,or
,not
{% if athlete_list and coach_list %}
athletes 和 coaches 变量都是可用的。
{% endif %}
ifequal/ifnotequal
for
遍历列表
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>
遍历字典
{% for i,j in views_dict.items %}
{{ i }}---{{ j }}
{% endfor %}
获取循环序号
forloop.counter: 顺序获取循环序号,从 1 开始计算
forloop.counter0: 顺序获取循环序号,从 0 开始计算
forloop.revcounter: 倒叙获取循环序号,结尾序号为 1
forloop.revcounter0: 倒叙获取循环序号,结尾序号为 0
forloop.first(一般配合if标签使用): 第一条数据返回 True,其他数据返回 False
forloop.last(一般配合if标签使用): 最后一条数据返回 True,其他数据返回 False
{% empty %}
循环为空时执行
{% for i in listvar %}
{{ forloop.counter0 }}
{% empty %}
空空如也~
{% endfor %}
include 标签
允许在模板中包含其它的模板的内容
{% include "nav.html" %}
csrf_token
csrf_token 用于form表单中,作用是跨站请求伪造保护。
如果不用{% csrf_token %}标签,在用 form 表单时,要再次跳转页面会报403权限错误。
用了{% csrf_token %}标签,在 form 表单提交数据时,才会成功
解析见菜鸟教程
自定义标签和过滤器
自定义标签和过滤器的作用: 做自定义计算、或者转换显示等等
注意: 自定义过滤器的参数最多2个
步骤
-
创建
templatetags
文件夹,和templates
目录同级 -
创建任意py文件,如
my_tags.py
-
编写
my_tags.py
from django import template register = template.Library()
-
配置
settings.py
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' # 添加这边三行配置 } # 添加这边三行配置 }, }, ]
-
自定义装饰器
@register.filter def my_filter(v1, v2): return v1 * v2
-
使用自定义装饰器
{% load my_tags %} // 导入 {{ 11|my_filter:22 }}
-
自定义标签
@register.simple_tag def my_tag1(v1, v2, v3): return v1 * v2 * v3
-
使用自定义标签
{% load my_tags %} // 导入 {% my_tag1 11 22 33 %}
模板继承
父模板预留
{% block 名称 %}
预留给子模板的区域,可以设置设置默认内容
{% endblock 名称 %}
子模板继承
{% extends "父模板路径"%}
子模板可以重写父模板预留处的内容
加载静态文件
-
django.contrib.staticfiles
添加到settings.INSTALLED_APPS
-
settings.py
中设置了STATIC_URL
STATIC_URL = '/static/'
-
加载
{% load static %} <link rel="stylesheet" href="{% static 'style.css' %}">
自动加载
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',
],
#添加在这个位置
'builtins' : [
'django.templatetags.static'
],
},
},
]
django-compress
用来压缩css和js
{% load compress %}
// css
{% compress css %}
<link rel="stylesheet" href="{% static 'pygments/default.css' %}"/>
<link rel="stylesheet" href="{% static 'blog/css/nprogress.css' %}">
{% endcompress %}
// js
{% compress js %}
<script type="text/javascript" src="{% static 'blog/js/jquery-3.1.1.js' %}"></script>
<script type="text/javascript" src="{% static 'blog/js/nprogress.js' %}"></script>
{% endcompress %}
缓存
{% load cache %}
{% cache 36000 nav %}
{% include 'share_layout/nav.html' %}
{% endcache %}