视频链接:https://www.bilibili.com/video/BV1vK4y1o7jH
一. 模板层 - 变量和标签
变量
视图函数中可以将Python变量封装到 字典 中传递到模板上
样例:
1 | def xxx_view(request): |
能传递到模板中的 数据类型
1 | str-字符串 int-整型 |
在模板中使用变量语法
1 | - {{ 变量名 }} |
演示:
1 | http://127.0.0.1:8000/test_html_param |
1 | # mysite1/mysite1/urls.py |
标签
模板标签
作用:将一些服务器端的功能嵌入到模板中,例如流程控制等
标签语法:
1 | {% 标签 %} |
if标签
语法:
1 | {% if 条件表达式1 %} |
注意:
if条件表达式里可以用的运算符 ==, !=, <, > , <=, >=, in, not in, is, is not, not、and、or
在if标记中使用实际括号是无效的语法。如果需要它们指示优先级,则应使用嵌套的if标记。
官方文档:https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/#if
演示:
1 | http://127.0.0.1:8000/test_if_for |
1 | # mysite1/mysite1/urls.py |
模板标签 - if标签 - 练习
写一个简单的计算器页面,能够在服务端进行简单加减乘除计算(需记录用户上次填写状态、下拉列表选择状态)
前端参考代码:
演示:
1
http://127.0.0.1:8000/mycal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44# mysite1/mysite1/urls.py
urlpatterns = [
...
path('mycal', views.test_mycal),
]
# mysite1/mysite1/views.py
def test_mycal(request):
if request.method == 'GET':
return render(request, 'mycal.html')
elif request.method == 'POST':
#处理计算
x = int(request.POST['x'])
y = int(request.POST['y'])
op = request.POST['op']
result = 0
if op == 'add':
result = x + y
elif op == 'sub':
result = x - y
elif op == 'mul':
result = x * y
elif op == 'div':
result = x / y
#dic={'x':x, 'y':y, 'op':op}
return render(request, 'mycal.html', locals()) # locals方法-局部变量直接封装成字典(Python自带方法)
# mysite1/templates/mycal.html
<form action='/mycal' method='post'>
<input type='text' name="x" value="{{ x }}">
<select name='op'>
<option value="add" {% if op == 'add' %}selected{% endif %} > +加</option> # ☆ 记录op状态,option selected属性,使用了if标签
<option value="sub" {% if op == 'sub' %}selected{% endif %}> -减</option>
<option value="mul" {% if op == 'mul' %}selected{% endif %}> *乘</option>
<option value="div" {% if op == 'div' %}selected{% endif %}> /除</option>
</select>
<input type='text' name="y" value="{{ y }}"> = <span>{{ result }}</span>
<div><input type="submit" value='开始计算'></div>
</form>
for标签
语法:
1
2
3
4
5{% for 变量 in 可迭代对象 %}
... 循环语句
{% empty %}
... 可迭代对象无数据时填充的语句
{% endfor %}官方文档:https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/#for
内置变量 - forloop
演示:
1 | http://127.0.0.1:8000/test_if_for |
1 | # mysite1/mysite1/urls.py |
小节
变量调用 - 点大法
标签语法 {% 标签 %} {% 结束标签 %}
二. 模板层 - 过滤器和继承
过滤器
定义:在变量输出时对变量的值进行处理
作用:可以通过使用 过滤器 来改变变量的输出显示
语法:**{{ 变量 | 过滤器1:'参数1' | 过滤器2:'参数2' ... }}**
官方文档:https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/
常用过滤器:
演示:
1 | http://127.0.0.1:8000/test_html_param |
1 | # mysite1/mysite1/urls.py |
继承
模板的继承
如下样例:
模板继承可以使父模板的内容重用,子模板直接继承父模板的全部内容并可以覆盖父模板中相应的块
语法 - 父模板中:
- 子模块中是允许被修改的
- 在父模板中定义,可以在子模板中覆盖
语法 - 子模板中:
extends
标签(写在模板文件的第一行)例如
{% extends 'base.html' %}
1
2
3{% block block_name %}
子模板块用来覆盖父模板中 block_name 块的内容
{% endblock block_name %} - block_name 可写可不写
重写的覆盖规则
注意
演示:
1 | http://127.0.0.1:8000/base_index |
1 | # mysite1/mysite1/urls.py |
小节
过滤器
{
变量
|过滤器
1:‘参数值
1’ | 过滤器2:‘参数值2’ … }模板的继承
父模板 -
定义可被修改的block
子模板 - 继承
父模板
;按需修改父模板中定义的block
三. url反向解析
代码中 url 出现位置
模板 【html中】
<a href=‘url’>超链接</a>
点击后 页面跳转至 url
<form action=‘url’ method=‘post’>
form表单中的数据 用post方法提交至 url
视图函数中 - 302跳转 HttpResponseRedirect(‘url’)
将用户地址栏中的地址跳转到 url
代码中 url 书写规范
绝对地址
相对地址
- ‘==/==page/1’ - ‘/’ 开头的相对地址,浏览器会把当前地址栏里的 协议,ip 和 端口 加上这个地址,作为最终访问地址,即如果当前页面地址栏为 http://127.0.0.1:8000/page/3;当前相对地址最终结果为
http://127.0.0.1:8000
+ /page/1 (☆ 高频使用) - ‘page/1’ - 没有 ‘/’ 开头的相对地址,浏览器会根据
当前 url 的最后一个 / 之前的内容 加上 该相对地址
作为最终访问地址,例如当前地址栏地址为 ==http://127.0.0.1:8000/topic/==detail;则该相对地址最终结果为http://127.0.0.1:8000/topic/
+ page/1
- ‘==/==page/1’ - ‘/’ 开头的相对地址,浏览器会把当前地址栏里的 协议,ip 和 端口 加上这个地址,作为最终访问地址,即如果当前页面地址栏为 http://127.0.0.1:8000/page/3;当前相对地址最终结果为
演示:
1 | http://127.0.0.1:8000/test/url |
1 | # mysite1/mysite1/urls.py |
url 反向解析
url 反向解析是指在视图或者模板中,用 path 定义的名称来动态查找或计算出相应的路由
path 函数的语法
- name=“别名”)
- 根据 path 中的 ‘name=’ 关键字传给 url 确定了个唯一确定的名字,在模板或视图中,可以通过这个名字反向推断出此 url 信息
模板中 - 通过 url 标签实现地址的反向解析
1
2
3
4
5{% url '别名' %}
{% url '别名' '参数值1' '参数值2' %}
ex:
{% url 'pagen' '400' %} --- 传参一律是 str
{% url 'person' age='18' name='gxn' %}演示:在模板中使用
1
http://127.0.0.1:8000/test/url
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# mysite1/mysite1/urls.py
urlpatterns = [
...
# http://127.0.0.1:8000/test/url
path('test/url', views.test_url),
path('test_urls_result/<int:age>', views.test_url_result, name='tr') # 起别名 tr
]
# mysite1/mysite1/views.py
def test_url(request):
return render(request, 'test_url.html')
def test_urls_result(request):
return HttpResponse('---test url res is ok')
# mysite1/templates/test_url.html
<a href="{% url 'tr' '100' %}">url反向解析版本</a> # ☆ 模板中使用别名在视图函数中 → 可调用 django 中的 reverse 方法进行反向解析
1
2
3
4
5
6
7from django.urls import reverse
reverse('别名', args=[], kwargs={})
ex:
print(reverse('pagen', args=[300]))
print(reverse('person', kwargs=
{'name':'peng', 'age':23}))演示:
1
2
3http://127.0.0.1:8000/test/url
# 302跳转 - 响应头里的 location 标记跳转地址1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32# mysite1/mysite1/urls.py
urlpatterns = [
...
path('base_index', views.base_view, name='base_index'), # 起别名 base_index
# http://127.0.0.1:8000/test/url
path('test/url', views.test_url),
path('test_urls_result/<int:age>', views.test_url_result, name='tr') # 起别名 tr
]
# mysite1/mysite1/views.py
def base_view(request):
lst = ['Tom', 'Jack']
return render(request, 'base.html', locals())
def test_url(request):
return render(request, 'test_url.html')
def test_url_result(request, age):
#302跳转
from django.urls import reverse
url = reverse('base_index') # ☆ 视图函数中使用别名
return HttpResponseRedirect(url)
#---------------------------------------------------------------
# mysite1/templates/test_url.html
<a href="{% url 'tr' '100' %}">url反向解析版本</a>
# mysite1/templates/base.html
略
四. 总结
请求(request)和响应(HttpResponseqing)
GET/POST处理 - request.GET/POST
MVC 和 MTV
模板层基础配置
模板变量/标签/过滤器/继承
url反向解析