04_Django-模板变量/标签/过滤器/继承-url反向解析
视频链接: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
 7- from django.urls import reverse 
 reverse('别名', args=[], kwargs={})
 ex:
 print(reverse('pagen', args=[300]))
 print(reverse('person', kwargs=
 {'name':'peng', 'age':23}))- 演示: - 1 
 2
 3- http://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反向解析 
- 感谢你赐予我前进的力量