if、for
语法结构
html
{% if .... %}//if的开始标识,表达式满足python语法即可,但不支持含小括号的条件
...
{% endif %}//结束标识
{% for var in mylist %} //这里遍历的只要是python中的可遍历数据结构即可
...
{% empty %}
... #如果为遍历目标空,则会执行这一区块内容
{% endif %}//结束标识
if练习
Q:在模版中,完成四种基本运算的显示
形如 input1_____ (operation) input2_____ = result
html模版代码
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/test_iffor" method="post">
<input type="text" name="var1" value="{{ a }}">
<label for="op">请选择操作:</label>
<select name='op' id="op">
<option value="1" {% if op == '1' %}selected{% endif %}>+</option>
<option value="2" {% if op == '2' %}selected{% endif %}>-</option>
<option value="3" {% if op == '3' %}selected{% endif %}>*</option>
<option value="4" {% if op == '4' %}selected{% endif %}>/</option>
</select>
<input type="text" name="var2" value="{{ b }}">
<input type="submit">
<p>结果为{{ res }}</p>
</form>
</body>
</html>
代码解释
1.我用了两个type为text的文本输入框,并将变量分别命名为var1和var2
2.option中从1~4分别对应加减乘除,同时对应的op为对应的字符'1'到'4'
3.在option标签中加入了if语句,用于保持当前选择与op相同,不会在表单提交后重置
4.同样的,为了保持输入数据后不立马重置输入框,对输入框分别设置默认值为a和b
(这也意味着等会视图函数传入变量名也应为a和b)
视图函数
python
def test_calculater(request):
from django.shortcuts import render
if request.method == 'GET':
return render(request, 'calculater.html')
elif request.method == 'POST':
a = float(request.POST['var1'])
b = float(request.POST['var2'])
op = request.POST['op']
if op == '1':
res = a + b
elif op == '2':
res = a - b
elif op == '3':
res = a * b
else:
res = a / b
# dict = {"a": a, "b": b, "res": res, "op": op}
return render(request, 'calculater.html', locals()) # 这里等效于传入了dict
# 配置路由如下
path("test_iffor",views.test_calculater),
# 接下来可以通过127.0.0.1:8000/test_iffor访问该页面
运行效果
for练习
for循环中的内置变量forloop,其有如下属性
示例代码
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>这是测试for循环模版</h1>
{% for var in lis %}
<p>{{ forloop }} {{ var }}</p>
{% empty %}
传入列表为空
{% endfor %}
<h1>我是分隔行</h1>
{% for var in non %}
<p>{{ var }}</p>
{% empty %}
传入列表为空
{% endfor %}
</body>
</html>
python
# 视图函数及路由
def test_for(request):
if request.method == 'GET':
dict = {'lis': ['alice', 'bob', 'brown']}
return render(request, 'test_for.html', dict)
path("test_for",view1.test_for)
运行效果
有了这个运行结果能够更清晰地理解内置变量forloop各种用法的作用
模版中的过滤器
对于safe:如果传入的字符串满足html语法,django会将其转义后作为纯文本显示在网页上
如果在传入后加上safe过滤器,该字符串也能起到对应的html/css/js效果
模版的继承
1.创建一个base.html文件
2.在可以被子模块修改的地方用↓包围起来
{% block block_name %}
{% endblock %}
一旦该block_name在子模块中被重定义则按子模块显示,如无则按base.html显示
3.创建子模块,删除初始化的html代码,取而代之只用写一行
{% extends 'base.html' %}
4.重写base.html中的各种块,名称一定要保持一致!