一.模板使用
1. 配置模板目录
如果命令行创建的项目,需要手动配置模板文件目录,如果是Pycharm创建的项目,则无需配置
- 在项目根目录下创建模板目录,比如叫
templates
,后续开发模板文件会放在此目录下 -
在项目的配置文件
settings.py
文件中,进行模板目录的配置,如下:
2. 定义模板文件
在templates
目录中新建一个模板文件,如show.html
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>Title</title>
6 </head>
7 <body>
8 <!-- 显示模板变量 -->
9 <h1>{我的名字是:{ name }}</h1>
10
11 </body>
12 </html>
3. 模板渲染
方法一:通过render函数
1 from django.shortcuts import render
2
3 def index(request):
4 data_dict = {'name': 'django' }
5 # 参数1:请求对象
6 # 参数2:模块路径
7 # 参数3:字典数据
8 return render(request, 'index.html', data_dict)
方法二:通过Template对象的render方法
1 from django.template import loader
2
3 def index(request):
4 # 获取模板对象
5 template = loader.get_template('index.html') # type: Template
6 # 渲染得到字符串
7 data_dict = {'name': 'django' }
8 html_str = template.render(data_dict)
9 # 响应请求
10 return HttpResponse(html_str)
二.模板的语法
- 模板变量
- 模板语句
- 过滤器
- 注释
- 模板继承
1. 模板变量
变量名必须由字母、数字、下划线(不能以下划线开头)和点组成,语法如下:
{{ 变量 }}
模板变量可以使python的内建类型,也可以是对象。
2. 模板语句
1)for循环:
{% for item in 列表 %}
{{forloop.counter}} <1-- 表示当前是第几次循环,从1开始 -->
{{forloop.counter0}} <!-- 表示当前是第几次循环,从0开始 -->
{% empty %} 查下
列表为空或不存在时执行此逻辑
{% endfor %}
2)if条件:
{% if ... %}
逻辑1
{% elif ... %}
逻辑2
{% else %}
逻辑3
{% endif %}
比较运算符如下:
==
!=
<
>
<=
>=
布尔运算符如下:
and
or
not
注意:运算符左右两侧必须有空格。
{% if a == 1 %} # 正确
{% if a==1 %} # 错误
3. 过滤器
语法如下:
- 使用管道符号|来应用过滤器,用于进行计算、转换操作,可以使用在变量、标签中。
-
如果过滤器需要参数,则使用冒号:传递参数。
变量|过滤器:参数
{%
if forloop.counter|divisibleby:2 %}
列举几个如下:
- safe,禁用html转义(显示html标签样式,而不是字符串){{content|safe}}控制一个
- {% autoescape off%} {{content}} {% endautoescape %} 关闭转义 可以控制多个
- length,长度,返回字符串包含字符的个数,或列表、元组、字典的元素个数。
-
default,默认值,如果变量不存在时则返回默认值。
data|default:'默认值'
-
date,日期,用于对日期类型的值进行字符串格式化,常用的格式化字符如下:
- Y表示年,格式为4位,y表示两位的年。
- m表示月,格式为01,02,12等。
- d表示日, 格式为01,02等。
- j表示日,格式为1,2等。
- H表示时,24进制,h表示12进制的时。
- i表示分,为0-59。
- s表示秒,为0-59。
value|date:"Y年m月j日 H时i分s秒"
4. 注释
1)单行注释语法如下:
{#...#}
2)多行注释使用comment标签,语法如下:
{% comment %}
...
{% endcomment %}
5. 模板继承
- 模板继承和类的继承含义是一样的
- 可以使用模板继承来复用父模板,提高代码的复用性,减轻开发人员的工作量。
- 可以通过定义
block
,实现子模板对父模块内容的重写
父模板
如果发现在多个模板中某些内容相同,那就可以使用block
标签把这段内容定义到父模板中。
{% block 块名称 %}
预留区域,可以编写默认内容,也可以没有默认内容
{% endblock %}
子模板
-
使用
extends
标签继承父模板,写在子模板文件的第一行。{% extends "父模板路径" %}
-
对有需要的
block
进行重写:- 不用重写父模版中的所有block,如果子模版没有重写,则使用父模版定义的默认值。
-
可以使用
block.super
来包含父模板的块中定义的内容,如下{% block 名称 %} 子模板的内容 {{ block.super }} 显示父模板中block的内容 {% endblock %}
django文档参考
<https://docs.djangoproject.com/zh-hans/2.1/ref/templates/builtins/>
django过滤器大全
<https://www.cnblogs.com/Deaseyy/p/10859893.html>