1.模板层传值
方式1:在views重定义函数时,将函数体代码里的名字用字典的键一一对应,将该字典当做render()的第三个参数传给html文件。在html文件中通过{{键名}}的方式拿到views中的名字。
views:
def func1(request):
name = 'max'
age = 25
hobby = ['soccer','read','run']
return render(request,'func1.html', {'d1':name,'d2':age,'d3':hobby})
func1.html:
<body>
{{ d1 }}
{{ d2 }}
{{ d3 }}
</body>
方式二:在views中的功能函数中将locals()当做render的第三个参数传递给html文件中,在html文件中直接拿到views中对应函数的名字。
views:
def func1(request):
name = 'max'
age = 25
hobby = ['soccer','read','run']
return render(request,'func1.html', locals())
func1.html:
<body>
{{ name }}
{{ age }}
{{ hobby }}
</body>
2.模板层之标签
1.模板层if条件判断:
{% if 条件1(可以自己写也可以用视图层传递过来的数据) %}
执行的条件
{% elif 条件2(可以自己写也可以用视图层传递过来的数据) %}
执行的条件
{% else %}
执行的条件
{% endif %}
'''可以只有if/else分支,elif可有可无'''、
views.py:
def index_func(request):
a1 = 1
a2 = 0
return render(request,'indexPage.html', locals())
indexPage.html:
<body>
{% if a1 %}
<p>if成立打印的语句</p>
{% else %}
<p>if不成立执行的语句</p>
{% endif %}
</body>
2.模板层for循环:
2.1基本与方法举例说明:
views.py:
def index_func(request):
l1 = [1, 2, 3, 4, 5]
return render(request, 'indexPage.html', locals())
indexPage.html:
<body>
{% for l in l1 %}
<p>{{ l }}</p>
{% endfor %}
</body>
2.2:forloop对象是for循环中用来判断索引值,是否是第一个或最后一个的对象。
indexPage.html:
<body>
{% for l in l1 %}
<p>{{forloop}}</p>
{% endfor %}
</body>
结果:

<body>
{% for l in l1 %}
<p>索引值:{{forloop.counter0}}| 索引值(从1开始){{ forloop.counter }}|是否是第一个{{ forloop.first }}|是否是最后一个{{ forloop.last }}</p>
{% endfor %}
</body>

将if和for循环(forloop)结合起来:
views.py:
def index_func(request):
l1 = ['max', 'marry', 'jason', 'jack', 'jerry']
return render(request, 'indexPage.html', locals())
indexPage.html:
<body>
{% for l in l1 %}
{% if forloop.first %}
<p>这是我最后一次循环 {{ l }}</p>
{% elif forloop.last %}
<p>这是我最后一次循环 {{ l }}</p>
{% else %}
<p>{{ l }}</p>
{% endif %}
{% endfor %}
</body>
3.当for循环中出现无法循环的数据类型时,例如空列表,空字符串等,可以在for循环的子代码中添加{% empty %},无法循环的数据类型就会执行{% empty %}的子代码。
views.py:
def index_func(request):
l1 = ['max', 'marry', 'jason', 'jack', 'jerry']
l2 = []
return render(request, 'indexPage.html', locals())
indexPage.html:
<body>
{% for l in l2 %}
{{ l }}
{% empty %}
<p>无法循环</p>
{% endfor %}
</body>
4.django模板语法取值操作:只支持句点符,句点符可以点索引值也可以点字典的键。
views.py:
def index_func(request):
dict1 = {'name':'max','list':[1,2,3,4,5,{'city':'shanghai','province':'guangdonng'}]}
return render(request, 'indexPage.html', locals())
indexPage.html:
<body>
{{ dict1.list.5.city }}
</body>
3.自定义过滤器、标签及inclusion_tag(了解)
"""
如果想要自定义一些模板语法 需要先完成下列的三步走战略
1.在应用下创建一个名字必须叫templatetags的目录
2.在上述目录下创建任意名称的py文件
3.在上述py文件内先编写两行固定的代码
from django import template
register = template.Library()
"""
1.自定义过滤器:最大只支持两个参数,通过 参数1|过滤器名:参数2 来传值
在templatetags中新建一个py文件名叫mytag.py,在mytag中定义过滤器,在views中给html页面传值,传值需要两个大括号包起来,并在前端页面展示:
mytag.py:
@register.filter(name='myplus')
def func1(a, b):
return a + b
views.py:
def index_func(request):
a = 2
b = 5
return render(request, 'indexPage.html', locals())
indexPage.html:
<body>
{% load mytag %}
<p>{{ a|myplus:b }}</p>
</body>
2.自定义标签:参数个数没有限制,在html页面传值通过标签名 空格 值的方式来传值,传值只需要一个大括号。
mytag.py:
@register.simple_tag(name='mytag')
def func2(a,b,c,d):
return f'{a}:{b}:{c}:{d}'
indexPage.html:
<body>
{% load mytag %}
{% mytag 'max' 'jerry' 'henry' 'kevin' %}
</body>
3.自定义inclusion_tag(局部的html代码):先在indexPage.html中调用mymenu,然后将处理好的标签(字符串类型)列表传给menu.html文件,在menu.html中遍历所有的标题。
mytag.py:
@register.inclusion_tag('menu.html',name='mymenu')
def func3(n):
html = []
for i in range(n):
html.append('<li>第%s页<li>' % i)
return locals()
menu.html:
{% for a in html %}
{{ a|safe }}
{% endfor %}
indexPage.html:
<body>
{% load mytag %}
{% mymenu 20 %}
</body>
4.模板的继承与导入
模板的继承(重要):多个页面有很多相似的地方,我们可以采取下列方式:
方式1:传统的复制粘贴
方式2:模板的继承(相当于划分出一块区域,该区域被模板语法包起来之后就可以自己编辑样式和内容,其他部分依旧沿用被继承的页面)
1.在模板中使用block划定可以修改的区域:
{% block 区域名称 %}
{% endblock %}
2.子板继承模板:
{% entends '被继承的html文件' %}
{% block 区域名称 %}
子板的内容
{% endblock %}
'''form表单中的action如果为空还是向当前页面提交数据'''
PS:模板中至少应该有三个区域,:页面内容区、css样式区、js代码区




3.当我们想要继承模板,并且想要改被继承模板的样式(例如颜色),如果被继承页面没有script标签,我们依旧需要在被继承模板的head标签内划定修改的区域(以修改标题颜色为例):
被继承html文件:
<head>
{% block css %}
{% endblock %}
</head>
继承html文件:
{% extends 'myhtml.html' %}
{% block css %}
<style>
color:
}
</style>
{% endblock %}

4.模板也可以继承父类模板之后继续在父类的基础上做扩展,该方法类似面向对象中的继承中的super方法,沿用父类的方法,并且做一些扩展。并且可以连续继承多次。
语法结构:
{% block content %}
{{ block.super }} (写几次父类中的目标范围的内容就会在子页面出现几次)
{% endblock %}

5.模板的导入:当有一个很漂亮的部分页面,我们想要借鉴的话,可以直接将该模板文件当做模块导入,导入的位置就会插入该内容。
语法结构:{% include 'html文件名' %}


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律