准备
- 新建templates文件
- settings设置TEMPLATES中的:DIRS指定模板文件路径。
Django自带模板
- 通过后端render()函数渲染。
- 模板语法:render(request对象,‘需要渲染的页面’,用于渲染模板的数据字典(context))
模板语法
模板变量
- 数字、字母、下划线、点(不能以下划线开头)
- {{变量}}
- 前端用于渲染的内容:变量、字典、列表…
- 后端:用于渲染的数据字典:contex={}包含所有前端需要的数据内容。
- 变量取值:变量名
- 点语法:
- 字典通过关键字取值 dict.key
- 列表通过下标取值 list.0 (注意不能用[]形式)
模板语句
- for循环
{% for item in 列表 %} {{forloop.counter}} # (模板变量)下标计数,默认从1开始 {{forloop.counter0}} #从0开始计数。只有0和1。 {% empty %} {% endfor %}
note:
- 变量是两对大括号,语法是一对大括号+一对百分号,并且百分号和大括号之间不能有空格,百分号和语句之间必须有空格。
- 有开就有关。
{% for… %}-----{% endfor %}
{% if… %}-------{% endif %}
note:
- 运算符两侧不能紧挨常量和变量必须要有空格。
过滤器
1.系统自带
{{变量|过滤器:参数}}
note:
- 过滤器格式为模板变量
- 变量过滤的内容即为在页面显示的内容。
{{ age|defult:18 }} # 当age不存在时,页面显示的内容为18,age存在时在页面显示的内容为Age值。
{{ list|length }} # 页面显示的内容为list长度。
{{ data|safe }} # 若data是个字符串,字符串中含有标签等,但是不会被html页面当作标签——即转义。设置safe则不会显示原本会显示的标签内容。
2.自定义过滤器
准备
- 在自己的应用里新建一个templatetags包。(包的.py文件就是你要引用的过滤器)
- 在.py文件中导入:
from django import template
- 实列化注册对象(注册装饰器)
register = template.Library() #Template调用自己的库方法
- 使用装饰器自定义过滤器(过滤器的实质是一个函数,自定义一个过滤器就是写一个函数)
@register.filter
def odd(x)
return x / 3
- 在html中使用自定义过滤器
{% load oddfilter %} # {% load odd_filter %}
<h1>{{ num | odd }}</h1> #显示额结果为视图中的num/3
note:
- 自定义过滤器写好使用前记得重启服务器。
模板继承
父模板:多个页面共同使用的功能,在填充差异性内容的部分使用:
{% block name%}
{% endblock name%}
子模版:
{% extends '父模板路径'%}
实际填充内容
{{ block.super }} #用于获取父模板中block的内容 个人认为父模板block中尽量不要填写内容,尽量不使用block.super
{% endblock 名称 %}
模板注释
单行注释:
{#...#}
{% comment%}
…
{% endcomment%}
``
Jinja2模板
djnago重量级框架,运行速度慢.
jinja2第三方模板,可扩展功能,轻量级跑得快。flask内置的就是jinja2模板。
jinja2不是django内置模板,所以需要配置。
jinja2_env.py
settings把django改为jinja2
使用基本和django自带模板相同,区别主要优以下几点:
1. for循环
loop.index/loop.index0
loop.revindex/loop.revindex0 # 倒着取
loop.first/loop.last # 第一次为True
loop.length
loop.cycle # {{loop.cycle(‘奇数’,‘函数’)}}循环过程中遍历循环输出cycle中的data。
自定义过滤器
- 在jinja2_env.py文件中自定义过滤器
from jinja2 import Environment
def enviroment(**options)
env = Enviroment(**options)
# 2.将自定义的过滤器添加到环境中
env.filter['do_listreverse'] = do_listreverse
# 1.自定义过滤器
def do_listreverse(li):
if li == 'B':
return '哈哈'