一、模板语法
{{ }}:变量相关
{% %}:逻辑相关
views.py
:
def hhh(request):
# 模板语法可以传递给后端python数据类型
# n = 123
# f = 2.33
# s = 'wdnmd'
# l = [1,2,3]
# d = {'name':'mbd', 'age':36}
# t = (1, 2, 3)
# se = {1, 3, 5, 6}
ddd = {'name': 'mbd', 'hobby': ['basket', 'foot', {'pigu': 'big', 'ding': 'qiao'}]}
def func():
print(123)
return 'wdnmd'
class Teacher:
def say(self):
return 'saying'
def eat(self):
return 'eating'
obj = Teacher()
return render(request, 'hhh.html', locals())
html页面:
{# <p>{{ n }}</p>#}
{# <p>{{ f }}</p>#}
{# <p>{{ s }}</p>#}
{# <p>{{ l }}</p>#}
{# <p>{{ t }}</p>#}
{# <p>{{ d }}</p>#}
{# <p>{{ se }}</p>#}
# django模板语法的取值,是固定的格式,只能采用句点.调用值或者索引
<p>{{ ddd.hobby.2.pigu }}</p>
<p>传递函数名会自动加括号调用,但是模板语法不支持给函数传额外的参数:{{ func }}</p>
<p>传递类名会自动加括号实例化对象,返回对象{{ Teacher }}</p>
<p>内部能够自动判断出当前的变量名是否可以加括号调用,如果可以就自动执行,针对的是函数名和类名</p>
<p>{{ obj }}</p>
<p>{{ obj.say }}</p>
<p>{{ obj.eat }}</p>
内部能够自动判断出当前的变量名是否可以加括号调用,如果可以就自动执行,针对的是函数名和类名
二、filter过滤器
过滤器就是类似于模板语法内置的,内置方法。
django内置有60多个过滤器,我们不需要这么多,了解十个左右就差不多了,后面碰到了再去记忆。
基本语法:
{{ 数据 | 过滤器:参数}}
{# 把数字按照文件大小转换出来 #}
<p>{{ file_size|filesizeformat }}</p>
<p>{{ s|length }}</p>
<p>{{ s|default:"666" }}</p>
<p>{{ date|date }}</p>
{# 转换时间格式 #}
<p>{{ s|slice:'0:4:2' }}</p>
{# 可以用于展示文章摘要 #}
<p>{{ l|truncatechars:9 }}</p>
{# 按照空格提取文章中的单词 #}
<p>{{ l|truncatewords:3 }}</p>
{# 移除 #}
<p>{{ s|cut:'D' }}</p>
{# 拼接 #}
<p>{{ s|join:' ' }}</p>
{# 加法 适用于整形或者字符串 #}
<p>{{ n|add:23456 }}</p>
三、标签
<h1>标签</h1>
{% for foo in ddd %}
<p>{{ forloop }}</p>
{% endfor %}
if流程控制
{% if 0 %}
<p>baby</p>
{% elif 0 %}
<p>no</p>
{% else %}
<p>yes</p>
{% for foo in l %}
{% if forloop.first %}
<p>这是我的第一次啊</p>
{% elif forloop.last %}
<p>这是最后一次了</p>
{% else %}
<p>{{ foo }}</p>
{% endif %}
{% empty %}
<p>for循环的可迭代对象内部没有元素,根本没法循环</p>
{% endfor %}
# 对于字典,是可以像后端一样.keys,.values,.items
{% for foo in ddd.keys %}
<p>{{ foo }}</p>
{% endfor %}
{% for foo in ddd.values %}
<p>{{ foo }}</p>
{% endfor %}
{% for foo in ddd.items %}
<p>{{ foo }}</p>
{% endfor %}
# with起别名
{% with ddd.hobby.2.pigu as m %}
{{ m }}
{{ m }}
{% endwith %}
四、自定义过滤器、标签、inclusion_tag
"""
先三步走
1.在应用下创建一个名字“必须”叫做templatestags的文件夹
2.在该文件夹下创建任意名称的py文件 eg.mytag.py
3.在该py文件内“必须”先写下下面这两句话
from django import template
register = template.Library()
"""
-
自定义过滤器的定义:
# 自定义过滤器(参数最多有两个) @register.filter(name='baby') def func1(a, b): return a + b
自定义过滤器的使用:
<h1>自定义的使用</h1> {% load tag %} <p>{{ n|baby:123 }}</p>
-
自定义标签的定义:
类似于自定义函数
# 自定义标签(参数可以有多个) @register.simple_tag(name='plus') def func2(a, b, c, d): return f'{a}-{b}-{c}-{d}'
自定义标签的使用:
{% load tag %} <p>{% plus 'jjj' 111 2223333 444 %}</p>
-
自定义inclusion_tag
""" 内部原理: 先定义一个方法 在页面上调用该方法,并且可以传值 该方法会生成一些数据然后传递给一个html页面 之后将渲染好的结果放到调用位置 """
定义:
# templatetags文件夹下任意命名.py文件内书写的内容 # 自定义inclusion_tag @register.inclusion_tag('process.html', name='process') def func3(n): data_list = [f'第{i}项' for i in range(1, n+1)] return locals()
# 调用时局部处理数据的process.html页面 <ul> {% for foo in data_list %} <li>{{ foo }}</li> {% endfor %} </ul>
自定义inclusion_tag的使用:
# 调用页面的调用方法 {% load tag %} <p>{% process 5 %}</p> <p>{% process 9 %}</p>
总结:当html页面偶一个地方的页面需要传参数才能够动态的渲染出来,并且在多个页面都需要使用到该局部,那么就考虑将该页面做成inclusion_tag形式。
五、模板的继承
在某一些环境下,网页的整体页面大差不差,在跳转的时候只是某一些局部在做变化,就可以用到模板的继承。
模板的继承:你自己先想好一个你想要继承的模板页面。
{% extends 'tem.html' %}
继承了值后子页面跟模板页面长得一模一样,你需要在模板页面上体检划定可以被修改的区域
{% block content %}
{% endblock %}
子页面就可以声明想要修改哪块划定了的区域
{% block content %}
子页面内容
{% end block %}
一般情况下模板页面上应该至少有三块可以被修改的区域
-
css区域
-
html区域
-
js区域
{% block css %}
{% endblock %}
{% block css %}
{% endblock %}
{% block js %}
{% endblock %}
这样每一个子页面就可以拥有自己的js、css和html页面。
一般情况下,模板中被划定的区域越多越好。但如果太多,还不如重新写一个页面。
六、模板的导入(了解)
"""
将页面的某一个局部当成一个模块使用
哪个地方需要就直接导入使用即可
"""
<p>模板的导入</p>
{% include 'wasai.html' %}