Django 笔记4 – 模板
Django 系列笔记是笔者学习、实践使用 Django 的相关笔记,大量参考了知了课堂的《Django零基础到项目实战》教程。
参考文档:
Django官方文档(英文)
Django 中文文档
一、模板
1、模板查找路径配置
配置TEMPLATES:
项目的settings.py文件中,有一个 TEMPLATES 配置,这个配置包含了模板引擎的配置,模板查找路径的配置,模板上下文的配置等。
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',
],
},
},
]
DIRS: 一个列表,在这个列表中可以存放所有的模板路径,以后在视图中使用 render 或者 render_to_string 渲染模板的时候,会在这个列表的路径中查找模板。
APP_DIRS: 默认为True,这个设置为True后,会在 INSTALLED_APPS 的安装了的APP下的 templates 目录中查找模板。
查找顺序: 查找一个模板,先在 DIRS 这个列表中依次查找路径下有没有这个模板,如果有,就返回。如果DIRS列表中所有的路径都没有找到,那么会先检查当前这个视图所处的 app 是否已经安装,如果已经安装了,那么就先在当前这个 app 下的 templates 文件夹中查找模板,如果没有找到,那么会在其他已经安装了的 app 中查找。如果所有路径下都没有找到,那么会抛出一个 TemplateDoesNotExist 的异常。
2、渲染模板
render_to_string():
from django.template.loader import render_to_string
from django.http import HttpResponse
# 将模板编译后渲染成Python的字符串格式后,再包装成HttpResponse对象
html = render_to_string("detail.html")
return HttpResponse(html)
render():
from django.shortcuts import render
# 直接将模板渲染成字符串并包装成HttpResponse对象
return render(request,'list.html')
二、DTL 模板
1、变量
- Django 在渲染模板的时候,可以传递变量对应的值过去进行替换。变量的命名规范和 Python 非常类似,只能是阿拉伯数字和英文字符以及下划线的组合,不能出现标点符号等特殊字符。变量需要通过视图函数渲染,视图函数在使用 render 或者render_to_string 的时候可以传递一个 context 的参数,这个参数是一个字典类型。以后在模板中的变量就从这个字典中读取值的。
- 模板中使用变量,格式:{{ key }}
- key 是一个字典,通过 key.key 得到 key 这个字典的键对应的值
- key 是一个对象,通过 key.xx 得到 key 这个对象的 xx 属性/方法。
- key 是一个列表/元组,通过 key.1,得到 key 这个列表/元组的第1个值
- 如果 key 中没有指定的东西,返回一个空的字符串
# html 模板代码,profile.html
<p>{{ username }}</p>
# 视图函数代码
def view(request):
return render(request, 'profile.html',context={'username':'huangyong'})
2、模板标签
if标签: if标签中可以使用==、!=、<、<=、>、>=、in、not in、is、is not等判断运算符。
{% if ..... %}
<p> .... </p>
{% else %}
<p> .... </p>
{% endif %}
for…in…标签: 可以遍历列表、元组、字符串、字典等一切可以遍历的对象
- forloop.counter:当前循环的下标,以1作为起始值。
- forloop.counter0:当前循环的下标,以0作为起始值。
- forloop.first:是否是第一次遍历。
- forloop.last:是否是最后一次遍历。
{% for ... in ... %}
<p>{{ ... }}</p>
{% endfor %}
**for…in…empty标签:**遍历的对象如果没有元素的情况下,会执行empty中的内容
{% for ... in ... %}
...
{% empty %}
...
{% endfor %}
with标签: 复杂的变量缓存到一个变量上
{% with 变量名=复杂的变量 %}
<p>{{ 变量名 }}</p>
{% endwith %}
url标签: url反转,通常用于 href 属性
<a href="{% url '视图函数' %}"> ... </a>
# url反转,使用关键字参数
<a href="{% url '视图函数' key=value %}">图书
3、模版过滤器
通过滤器可以对数据进行处理,类似于函数
add 过滤器: 变量加上一个值
{{ name |add: 'value' }}
date 过滤器: 日期转化成指定格式的字符串
# 数据
context = {"birthday": datetime.now()}
# 转化成 2018-01-01 格式
{{ birthday|date:"Y-m-d" }}
length 过滤器: 获取一个列表/元组/字符串/字典的长度
{{ list|length }}
4、模板继承
父模板:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{# 开一个口,子模板中自定义 #}
{% block main %}{% endblock %}
{# 也可以写成下面这样,更明了 #}
{% block main %}{% endblock main %}
</body>
</html>
子模板:
# 指定继承与那个模板
{% extends "base.html" %}
# 选择父模板中开的口子,自定义内容
{% block main %}自定义内容{% endblock %}
三、加载静态文件
1、静态文件
在一个网页中,不仅仅只有一个 html 骨架,还需要 css 样式文件,js 执行文件以及图片等。因此在 DTL 中加载静态文件是一个必须要解决的问题。在 DTL 中,使用 static 标签来加载静态文件。要使用 static 标签格式 {% load static %}。
2、静态文件路径配置
- 首先确保 django.contrib.staticfiles 已经添加到settings.INSTALLED_APPS中。
- 确保在settings.py中设置了STATIC_URL。
- 在已经安装了的 app 下创建一个文件夹叫做 static,然后再在这个 static 文件夹下创建一个当前app的名字的文件夹,再把静态文件放到这个文件夹下(如果直接把静态文件放在 static 文件夹下,在多个 app 之间有同名的静态文件时可能就会产生混淆)。
- 如果有一些静态文件是不和任何app挂钩的。那么可以在 settings.py 中添加 STATICFILES_DIRS,以后 DTL 就会在这个列表的路径中查找静态文件。
STATICFILES_DIRS = [ # 项目根目录下的 static 文件夹 os.path.join(BASE_DIR,"static") ]
- 在模版中使用 load 标签加载 static 标签,就可以直接使用 static 文件夹下的静态文件。
{% load static %} <link rel="stylesheet" href="{% static 'style.css' %}">
- 如果不想每次在模版中加载静态文件都使用 load 加载 static 标签,那么可以在 settings.py 中的 TEMPLATES.OPTIONS中 添加
'builtins':['django.templatetags.static']
,这样以后在模版中就可以直接使用 static 标签,而不用手动 load。 - 如果没有在 settings.INSTALLED_APPS 中添加 django.contrib.staticfiles。那么我们就需要手动的将请求静态文件的 url 与静态文件的路径进行映射了。
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # 其他的url映射 ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
GOOD LUCK!