模板设置
模板引擎在settings.py设置, django有两套模板引擎:
TEMPLATES = [
# DjangoTemplates
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 定义项目的通用模板, mysite/templates
'DIRS': [os.path.join(BASE_DIR, 'templates')],
# True 表示在所有安装应用的application/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',
]
},
},
# Jinja2
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
# 定义项目的通用模板, mysite/templates
'DIRS': [os.path.join(BASE_DIR, 'templates')],
# True表示在所有已安装应用的application/jinja2中查找。
'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',
]
},
},
]
BACKEND定义模板引擎,django内置的模板引擎有两个django.template.backends.django.DjangoTemplates(默认)和django.template.backends.jinja2.Jinja2
DIRS存放自定义的不在应用路径的模板,模板引擎按列表顺序搜索查找模板源文件,默认就是默认引擎的默认路径。
APP_DIRS告诉模板引擎是否进入安装应用的templates(jinja2的目录是jinja2)查找模板。
在视图中使用模板:
默认django会在项目的所有应用的templates中查找模板,所以为了防止多个应用有同名的模板,需要在templates下新建application同名的目录来存放模板
应用的模板文件需要在应用目录创建templates文件夹
默认模板放在polls/templates/polls/XXX.html
应用的静态文件需要在应用目录创建static文件夹
默认静态文件存放在polls/static/polls/XXX.css
静态文件夹用来集中存放和管理图片,js脚本和css样式表等静态文件。
django.template.loader定义了两个函数加载模板。
get_template(template_name, dirs=<object object>, using=None)
select_template(template_name_list, dirs=<object object>, using=None)
模板语言
django模板语言由四部分组成:
- 变量
- 标签
- 过滤器
- 评论
变量
{{ var }}
显示字符串:
string = "test string"
return render(request, 'index.html', {'string': string})
{{ string }}
显示字典:
dict = {"key1": "value1", "key2": "value2"}
return render(request, 'index.html', {'dict': dict})
{{ dict.name1 }}
标签
{% tag %}
参考内置标签:
http://python.usyiyi.cn/translate/django_182/ref/templates/builtins.html#ref-templates-builtins-tags
for标签:
遍历列表:
list = ['val1', 'val2', 'val3']
return render(request, 'index.html', {'list': 'list'})
```html
{% for i in list %}
{{ i }}
{% endfor %}
```
遍历字典:
```html
{% for key, value in dict.items %}
{{ key }}: {{ value }}
{% endfor %}
```
empty列表可能为空:
```html
{% for i in list %}
...
{% empty %}
...
{% endfor %}
```
reversed反向循环:
{% for i in list reversed %}
for循环有用的变量:
forloop.counter # 1 - indexed
forloop.counter0 # 0 - indexed
forloop.revcounter # 1 - indexed
forloop.revcounter0 # 0 - indexed
forloop.first
forloop.last
forloop.parentloop
if标签:
```html
{% if expression %}
...
{% else %}
...
{% endif %}
```
if可用的布尔操作符:
{% if expression1 and expression2 %}
{% if not expression %}
{% if expression1 or expression2 %}
{% if not expression1 or expression2 %} # not优先级高于or
{% if expression1 and not expression2 %} # not优先级高于and
{% if expression1 and expression2 or expression3 %} # and优先级高于or
{% if var == value %}
{% if var != value %}
{% if var < value %}
{% if var > value %}
{% if var <= value %}
{% if var >= value %}
{% if var in value %}
{% if a > b and b > c %}
{% if var|filter"arguments expression %} # if中使用过滤器
布尔操作符的优先级:
or
and
not
in
==, !=, <, >, <=, >=
include标签:
加载模板并以标签内的参数渲染。
{% include 'XXX.html' %}
load标签:
加载自定义模板标签集。
{% load foo bar from somelibrary %}
now标签:
显示最近的日期和事件。
spaceless标签:
删除html标签之间的空白格,包括制表符和换行。
url标签:
返回一个绝对路径的引用,该引用匹配一个给定的视图函数和一些可选的参数。
{% 'some-url-name' v1 v2 %}
模板继承
block标签:
在底层模板定义一些通用的内容,block标签可以被子模板覆盖。
```html
{% block XXX %}
This is default content
{% endblock %}}
```
extends标签:
表示当前模板继承自父模板。
extends标签必须放在子模板第一行。
extends用来调用底层的模板,然后修改block标签内容。
```html
{% extends "XXX.html"/variable %}
{% block XXX %}
This is rewrite content
{% endblock %}
```
block.super:
如果需要获取父模板的block中的内容,可以用block.super。
可以在父模板的block中增加内容,而不是完全覆盖。
过滤器
{{ var|filter:arguments }}
参考内置过滤器
add过滤器:
把add后的参数加给value。
{{ value|add:"2" }} # value -> value+2
{{ value|addslashes }} # "I'm string" -> "I\'m string"
addslashed过滤器:
在引号前面加\
{{ value|addslashes }} # I'm canux -> I\'m canux
capfirst过滤器:
变量的第一个字母大写。
{{ value|capfirst }}
center过滤器:
使value在给定的宽度范围内居中。
{{ value|center:"15" }}
cut过滤器:
移除value中所有的与给出的变量相同的字符串。
{{ value|cut:"cut" }} # 移除value中的字符串"cut"
date过滤器:
根据给定格式对一个date变量格式化。
default过滤器:
给value设定默认值,如果value没有赋值,就用默认值。
{{ value|default:"default-value" }}
default_if_none过滤器:
仅当value是None使用默认值。
{{ value:default_if_none:"nothing" }}
dictsort过滤器:
dictsortreversed过滤器:
divisibleby过滤器:
如果value可以被给出的参数整除,返回True。
{{ value|divisibleby:"3" }}
escape过滤器:
escapejs过滤器:
filesizeformat过滤器:
格式化为人类可读的文件大小。
first过滤器:
返回迭代器的第一个元素。
floatformat过滤器:
force_escape过滤器:
get_digit过滤器:
iriencode过滤器:
join过滤器:
last过滤器:
length过滤器:
length_is过滤器:
linebreaks过滤器:
linebreaksbr过滤器:
linenumbers过滤器:
ljust过滤器:
lower过滤器:
把字符串转换成小写。
make_list过滤器:
phone2numeric过滤器:
pluralize过滤器:
pprint过滤器:
random过滤器:
romevetags过滤器:
rjust过滤器:
slice过滤器:
slugify过滤器:
stringformat过滤器:
striptags过滤器:
time过滤器:
timesince过滤器:
timeuntil过滤器:
title过滤器:
truncatechars过滤器:
truncatechars_html过滤器:
truncatewords过滤器:
truncatewords_html过滤器;
unordered_list过滤器:
upper过滤器:
将字符串转换成大写形式。
urlencode过滤器:
urlize过滤器:
urlizetrunc过滤器:
wordcount过滤器:
wordwrap过滤器:
yesno过滤器:
i18n过滤器:
l10n过滤器:
tz过滤器:
注释
单行注释:
```html
{# this is single line comment #}
```
多行注释:
```html
{% comment %}
line1
line2
{% endcomment %}
```
自动html转义
当从模板生成html时,值可能包含影响html最终呈现的字符。
django的自动转义,默认是打开的:
< 转义成 <
> 转义成 >
' 转义成 '
" 转义成 "
$ 转义成 &
如果不需要自动转义可以关闭它
可以用safe过滤器关闭独立变量中的自动转义:
data = <b>
{{ data }} -> <b>
{{ data|safe }} -> <b>
可以用autoescape标签关闭模板代码中的自动转义:
autoescape标签有off和on两个参数,表示关闭和打开自动转义。
父模板中的autoescape可以被子模板继承,也可以被include标签包含的模板继承。
```html
{% autoescape off %}
{{ name }}
{% endautoescape %}
```