语法结构
- {% if .... %}//if的开始标识,表达式满足python语法即可,但不支持含小括号的条件
- ...
- {% endif %}//结束标识
-
-
- {% for var in mylist %} //这里遍历的只要是python中的可遍历数据结构即可
- ...
- {% empty %}
- ... #如果为遍历目标空,则会执行这一区块内容
- {% endif %}//结束标识
Q:在模版中,完成四种基本运算的显示
形如 input1_____ (operation) input2_____ = result
html模版代码
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Titletitle>
- 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)
- 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循环中的内置变量forloop,其有如下属性
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Titletitle>
- 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>
- # 视图函数及路由
- 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中的各种块,名称一定要保持一致!