Django的模板是用于快速生成页面返回给客户端,用于前后端不分离的业务,模板包含两部分,html代码和模板标签。
模板是一个文本文件。它可以生成任何基于文本的格式(HTML、XML、CSV 等)。
我们在settings的配置中可以找到如下代码
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',
],
},
},
]
Django 模板查找机制: Django 查找模板的过程是在每个 app 的 templates ⽂件夹中找(⽽不只是当前 app 中的代码只在当前的 app 的 templates ⽂件 夹中找)。各个 app 的 templates 形成⼀个⽂件夹列表,Django 遍历这个列 表,⼀个个⽂件夹进⾏查找,当在某⼀个⽂件夹找到的时候就停⽌,所有的都 遍历完了还找不到指定的模板的时候就是 Template Not Found (过程类似于 Python找包)。这样设计有利当然也有弊,有利是的地⽅是⼀个app可以⽤另 ⼀个app的模板⽂件,弊是有可能会找错了。所以我们使⽤的时候在 templates 中建⽴⼀个 app 同名的⽂件夹,这样就好了
好处是可以加载一次模板进行多次渲染
index.html
<h1>{{ content }} h1>
views.py
def index(request):
# 加载模板
temp = loader.get_template('./app/index.html')
# 渲染模板
res = temp.render(context={'content': 'Hello Django'})
# 返回结果
return HttpResponse(res)
def index(request):
return render(request, 'app/index.html', context={'content': 'Hello Django'})
django模板中包括两部分:变量和内置标签。变量会在模板渲染时被其值代替, 内置标签负责逻辑控制。
变量在模板中的表示为:{{ 变量名 }},变量名就是render中context中的键。变量 可以基本类型中的数值、字符串、布尔,也可以是字典、对象、列表等。django 提供了点号来访问复杂数据结构。
列表、元组:元素可以使⽤索引引⽤,不能使⽤负索引,语法:变量.索引 索引也是从0开始
字典: 语法:字典变量.key
对象: 语法:对象.属性 对象.⽅法名(⽅法不能有参数)
过滤器是在变量显示之前修改它的值的⼀个⽅法,过滤器使⽤管道符。过滤器可以串联调⽤
{{ 变量|⽅法 }}
常见的过滤器方法
方法 | 作用 | 示例 |
---|---|---|
default | 缺省值 | {{value|default:“缺省值” }} |
default_if_none | 如果变量是none则显示缺省值 | {{value|default_if_none:‘hello’ }} |
cut | 从字符中删除指定字符 | {{value| cut ’ '}} # 删除所有空格 |
length | 获取宁符串或列表 | {{ str|length}} |
lower | 所有字母小写 | |
upper | 所有字母大写 | |
truncatechars | 截取字符串前n个字符 | {{str|truncatechars:9}} |
date | 格式化日期字符串{{value | date:“Y-m-d H:i:s” }} |
add | 增加变量的值 | {{value|add:“3” }} |
divisibleby | 把变量的值除以指定的值 | {{value|divisibleby:“3” }} |
first | 获取列表起一个元素 | |
last | 获取列表最后一个元素 | |
join | 列表内容连接为一个字符串 | {{value|join ‘-’}} |
autoescape | 设置或者取消转义 | {%autoescape off%}{{val}}{%endautoescape%} |
下面是一些示例
{#没做处理的变量:#}
{{ test }}
{#设置了默认值的变量 在这个值被django认为是False的时候会使用此默认值。比如:空字符串,None。#}
{{ xx|default:'xxxxx' }}
{#设置了只有为None时才使用默认值的变量#}
{{ xx|default_if_none:'aaaaa'}}
{#变为小写后的变量#}
{{ test|lower }}
{#先变为小写再将首字母大写后的变量#}
{{ test|lower|capfirst }}
{#两个数字变量相加 add:字符串相加,数字相加,列表相加,如果失败,将会返回一个空字符串#}
{{ num1|add:num2 }}
{#两个字符串变量相加#}
{{ test|add:xx }}
{#列表变量的第一个元素#}
{{ list|first }}
{#列表变量的最后一个元素#}
{{ list|last }}
{#默认的data日期时间格式#}
{{ now|date }}
{#默认的time时间格式#}
{{ now|time }}
{#这是data过滤器的年月日24小时制时间格式#}
{{ now|date:'Y/m/d/H:i:s' }}
{#这是time过滤器的时分秒12小时制时间格式#}
{{ now|time:'h:i:s' }}
{#这是字符串的join方法 跟python中join一样的用法#}
{{ list|join:'oooo' }}
{#这是字符串的长度方法#}
{{ test|length }}
{#这是列表的长度是否为4#}
{{ list|length_is:4 }}
{#下面这俩有xxx.html类型的,针对html,截断标签中的字符,而不会截断标签#}
{#这是字符串只显示4个字符,其余省略(但是占3位)#}
{{ test|truncatechars:7 }}
{#这是字符串只显示2个单词,其余省略(不占位)#}
{{ test|truncatewords:2 }}
{#这是字符串的切片#}
{{ test|slice:'1:4' }}
{#这是列表的切片#}
{{ list|slice:'2' }}
{#这是含html标签的字符串#}
{{ html }}
{#这是去掉字符串中的html标签#}
{{ html|striptags }}
{#这是关掉自动转义,使字符串中html标签生效#}
{{ html|safe }}
{#这是没做处理的小数#}
{{ float }}
{#这是保留了一位小数#}
{{ float|floatformat }}
{#这是保留了两位小数#}
{{ float|floatformat:'2' }}
语法:{% tag %}
{% if express1 %}
# to do
{% elif express2 %}
# to do
{% else %}
# to do
{% endif %}
if表达式中使⽤以下运算符(优先级从⾼到低):
< >= <= == !=
in 、not in
is、is not
not
and
or
{% for x in y %}
...
{% endfor %}
反向迭代
{% for value in c [1,2,3,4,5] reversed %}
{{ value }}---
{% endfor %}
empty
{% for value in c %}
{{ value }}---
{% empty %}
数据不存在
{% endfor %}
字典迭代
# e = {'a':20,'b':40}
{% for k,v in e.items %}
{{ k }}---{{ v }}
{% endfor %}千
用于判断两个值想等或者不相等
{% ifequal var var %}
{% endifequal %}
{% ifnotequal var var %}
{% endifnotequal %}
{# 这里写注释 #}
什么是静态资源:css、js、images 需要从外部导⼊的资源
{% load static %}
{#硬编码#}
{#软编码 建议使用这种#}
需要在setting中加一句话,其实就是这个位置定义了静态资源的存放位置
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
]