04_Django-模板变量/标签/过滤器/继承-url反向解析

视频:https://www.bilibili.com/video/BV1vK4y1o7jH

博客:https://blog.csdn.net/cpen_web


一. 模板层 - 变量和标签

变量

  • 视图函数中可以将Python变量封装到 字典 中传递到模板上

样例:

  1. def xxx_view(request):
  2. dic = {
  3. "变量1": "值1",
  4. "变量2": "值2",
  5. }
  6. return render(request, 'xxx.html', dic)
  • 能传递到模板中的 数据类型
  1. str-字符串 int-整型
  2. list-数组 tuple-元组
  3. dict-字典 func-方法
  4. obj-类实例化的对象
  • 在模板中使用变量语法
  1. - {{ 变量名 }}
  2. - {{ 变量名.index }}
  3. - {{ 变量名.key }}
  4. - {{ 对象.方法 }}
  5. - {{ 函数名 }}
  • 演示:
  1. http://127.0.0.1:8000/test_html_param

  1. # mysite1/mysite1/urls.py
  2. urlpatterns = [
  3. ...
  4. path('test_html', views.test_html)
  5. ]
  6. # mysite1/mysite1/views.py
  7. def test_html_param(request):
  8. dic = {}
  9. dic['int'] = 88
  10. dic['str'] = 'peng'
  11. dic['lst'] = ['Tom', 'Jack', 'Lily']
  12. dic['dict'] = {'a':9, 'b':8}
  13. dic['func'] = say_hi
  14. dic['class_obj'] = Dog()
  15. dic['script'] = '<script>alert(1111)</script>'
  16. return render(request, 'test_html_param.html', dic)
  17. def say_hi():
  18. return 'hahaha'
  19. class Dog:
  20. def say(self):
  21. return 'wangwang'
  22. # mysite1/templates/test_html_param.html
  23. <h3>int {{ int|add:"2" }}</h3>
  24. <h3>str {{ str|upper }}</h3>
  25. <h3>lst {{ lst }}</h3>
  26. <h3>lst {{ lst.0 }}</h3>
  27. <h3>dict {{ dict }}</h3>
  28. <h3>dict['a'] {{ dict.a }}</h3>
  29. <h3>function {{ func }}</h3>
  30. <h3>class_obj {{ class_obj.say }}</h3>
  31. <h3>script {{ script|safe }}</h3>

标签

模板标签

  • 作用:将一些服务器端的功能嵌入到模板中,例如流程控制等
  • 标签语法:
  1. {% 标签 %}
  2. ...
  3. {% 结束标签 %}

if标签

  • 语法
  1. {% if 条件表达式1 %}
  2. ...
  3. {% elif 条件表达式2 %}
  4. ...
  5. {% elif 条件表达式3 %}
  6. ...
  7. {% else %}
  8. ...
  9. {% endif %} - 需要有结束标签
  • 注意
  1. if条件表达式里可以用的运算符 ==, !=, <, > , <=, >=, in, not in, is, is not, not、and、or
  2. 在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
  2. urlpatterns = [
  3. ...
  4. path('test_if_for', views.test_if_for),
  5. ]
  6. # mysite1/mysite1/views.py
  7. def test_if_for(request):
  8. dic = {}
  9. dic['x'] = 20
  10. dic['lst'] = ['Tom', 'Jack', 'Lily']
  11. return render(request, 'test_if_for.html', dic)
  12. # mysite1/templates/test_if_for.html
  13. {% if x > 10 %}
  14. 今天天气很好
  15. {% else %}
  16. 今天天气非常好
  17. {% endif %}
  18. <br>
  19. {% for name in lst %}
  20. {% if forloop.first %} &&&&& {% endif %}
  21. <p> {{ forloop.counter }} {{ name }}</p>
  22. {% if forloop.last %} ===== {% endif %}
  23. {% empty %}
  24. 当前没数据
  25. {% endfor %}
  • 模板标签 - if标签 - 练习

    写一个简单的计算器页面,能够在服务端进行简单加减乘除计算(需记录用户上次填写状态、下拉列表选择状态)

    • 前端参考代码:

    • 演示:

    1. http://127.0.0.1:8000/mycal

    1. # mysite1/mysite1/urls.py
    2. urlpatterns = [
    3. ...
    4. path('mycal', views.test_mycal),
    5. ]
    6. # mysite1/mysite1/views.py
    7. def test_mycal(request):
    8. if request.method == 'GET':
    9. return render(request, 'mycal.html')
    10. elif request.method == 'POST':
    11. #处理计算
    12. x = int(request.POST['x'])
    13. y = int(request.POST['y'])
    14. op = request.POST['op']
    15. result = 0
    16. if op == 'add':
    17. result = x + y
    18. elif op == 'sub':
    19. result = x - y
    20. elif op == 'mul':
    21. result = x * y
    22. elif op == 'div':
    23. result = x / y
    24. #dic={'x':x, 'y':y, 'op':op}
    25. return render(request, 'mycal.html', locals()) # locals方法-局部变量直接封装成字典(Python自带方法)
    26. # mysite1/templates/mycal.html
    27. <form action='/mycal' method='post'>
    28. <input type='text' name="x" value="{{ x }}">
    29. <select name='op'>
    30. <option value="add" {% if op == 'add' %}selected{% endif %} > +加</option> # ☆ 记录op状态,option selected属性,使用了if标签
    31. <option value="sub" {% if op == 'sub' %}selected{% endif %}> -减</option>
    32. <option value="mul" {% if op == 'mul' %}selected{% endif %}> *乘</option>
    33. <option value="div" {% if op == 'div' %}selected{% endif %}> /除</option>
    34. </select>
    35. <input type='text' name="y" value="{{ y }}"> = <span>{{ result }}</span>
    36. <div><input type="submit" value='开始计算'></div>
    37. </form>

for标签

  • 演示:
  1. http://127.0.0.1:8000/test_if_for

  1. # mysite1/mysite1/urls.py
  2. urlpatterns = [
  3. ...
  4. path('test_if_for', views.test_if_for),
  5. ]
  6. # mysite1/mysite1/views.py
  7. def test_if_for(request):
  8. dic = {}
  9. dic['lst'] = ['Tom', 'Jack', 'Lily']
  10. return render(request, 'test_if_for.html', dic)
  11. # mysite1/templates/test_if_for.html
  12. {% for name in lst %}
  13. {% if forloop.first %} &&&&& {% endif %}
  14. <p> {{ forloop.counter }} {{ name }}</p>
  15. {% if forloop.last %} ===== {% endif %}
  16. {% empty %}
  17. 当前没数据
  18. {% endfor %}

小节

  • 变量调用 - 点大法
  • 标签语法 {% 标签 %} {% 结束标签 %}

二. 模板层 - 过滤器和继承

过滤器

  • 定义:在变量输出时对变量的值进行处理
  • 作用:可以通过使用 过滤器 来改变变量的输出显示
  • 语法:{{ 变量 | 过滤器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
  2. urlpatterns = [
  3. ...
  4. path('test_html', views.test_html)
  5. ]
  6. # mysite1/mysite1/views.py
  7. def test_html_param(request):
  8. dic = {}
  9. dic['int'] = 88
  10. dic['script'] = '<script>alert(1111)</script>'
  11. return render(request, 'test_html_param.html', dic)
  12. def say_hi():
  13. return 'hahaha'
  14. class Dog:
  15. def say(self):
  16. return 'wangwang'
  17. # mysite1/templates/test_html_param.html
  18. <h3>int {{ int|add:"2" }}</h3>
  19. <h3>str {{ str|upper }}</h3>
  20. <h3>script {{ script|safe }}</h3>

继承

模板的继承

​ 如下样例:

  • 模板继承可以使父模板的内容重用,子模板直接继承父模板的全部内容并可以覆盖父模板中相应的块

  • 语法 - 父模板中:

    • 定义父模板中的**块 block **标签
    • 表时出哪些在子模块中是允许被修改
    • block 标签:在父模板中定义,可以在子模板中覆盖
  • 语法 - 子模板中:

    • 继承模板 extends 标签(写在模板文件的第一行)

      例如 {% extends 'base.html' %}

    • 子模板 重写父模板中的内容块

      1. {% block block_name %}
      2. 子模板块用来覆盖父模板中 block_name 块的内容
      3. {% endblock block_name %} - block_name 可写可不写
  • 重写的覆盖规则

    • 不重写,将按照父模板中的效果显示
    • 重写,则按照重写效果显示
  • 注意

    • 模板继承时,服务器端的动态内容无法继承
  • 演示:

  1. http://127.0.0.1:8000/base_index

  1. # mysite1/mysite1/urls.py
  2. urlpatterns = [
  3. ...
  4. path('base_index', views.base_view, name='base_index'),
  5. path('music_index', views.music_view),
  6. path('sport_index', views.sport_view),
  7. ]
  8. # mysite1/mysite1/views.py
  9. def base_view(request):
  10. lst = ['Tom', 'Jack']
  11. return render(request, 'base.html', locals())
  12. def music_view(request):
  13. return render(request, 'music.html')
  14. def sport_view(request):
  15. return render(request, 'sport.html')
  16. #-------------------------------------------------------------
  17. # mysite1/templates/base.html # 父模板
  18. <!DOCTYPE html>
  19. <html lang="en">
  20. <head>
  21. <meta charset="UTF-8">
  22. {% block mytitle %}
  23. <title>主页</title> # 子模板能改的地方
  24. {% endblock %}
  25. </head>
  26. <body>
  27. {{ lst }} # 子模板无法继承变量(动态内容)
  28. <a href="/music_index">音乐频道</a> # 子模板不能改
  29. <a href="/sport_index">体育频道</a>
  30. <br>
  31. {% block info %}
  32. 这是主页 # 子模板能改的地方
  33. {% endblock %}
  34. <br>
  35. <h3>有任何问题联系xxxx</h3> # 子模板不能改
  36. # mysite1/templates/music.html # 子模板
  37. {% extends 'base.html' %} # 继承父模板
  38. {% block mytitle %}
  39. <title>音乐频道</title> # 子模板重写block
  40. {% endblock %}
  41. {% block info %}
  42. 欢迎来到音乐频道
  43. {% endblock %}
  44. # mysite1/templates/sport.html
  45. {% extends 'base.html' %}
  46. {% block mytitle %}
  47. <title>体育频道</title>
  48. {% endblock %}
  49. {% block info %}
  50. 欢迎来到体育频道
  51. {% endblock %}

小节

  • 过滤器

    { 变量 | 过滤器1:'参数值1' | 过滤器2:'参数值2' ... }

  • 模板的继承

    父模板 - 定义可被修改的block

    子模板 - 继承父模板;按需修改父模板中定义的block


三. url反向解析

  • 代码中 url 出现位置

    1. 模板 【html中】

      1. <a href='url'>超链接</a>

        点击后 页面跳转至 url

      2. <form action='url' method='post'>

        form表单中的数据 用post方法提交至 url

    2. 视图函数中 - 302跳转 HttpResponseRedirect('url')

      将用户地址栏中的地址跳转到 url

  • 代码中 url 书写规范

    1. 绝对地址

      http://127.0.0.1:8000/page/1

    2. 相对地址

      1. '/page/1' - '/' 开头的相对地址,浏览器会把当前地址栏里的 协议,ip 和 端口 加上这个地址,作为最终访问地址,即如果当前页面地址栏为 http://127.0.0.1:8000/page/3;当前相对地址最终结果为 http://127.0.0.1:8000 + /page/1 (☆ 高频使用)
      2. 'page/1' - 没有 '/' 开头的相对地址,浏览器会根据当前 url 的最后一个 / 之前的内容 加上 该相对地址 作为最终访问地址,例如当前地址栏地址为 http://127.0.0.1:8000/topic/detail;则该相对地址最终结果为 http://127.0.0.1:8000/topic/ + page/1
  • 演示:

  1. http://127.0.0.1:8000/test/url

  1. # mysite1/mysite1/urls.py
  2. urlpatterns = [
  3. ...
  4. # http://127.0.0.1:8000/test/url
  5. path('test/url', views.test_url),
  6. path('test_url_result', views.test_url_result)
  7. ]
  8. # mysite1/mysite1/views.py
  9. def test_url(request):
  10. return render(request, 'test_url.html')
  11. def test_url_result(request):
  12. return HttpResponse('---test url res is ok')
  13. # mysite1/templates/test_url.html
  14. <a href="http://127.0.0.1:8000/test_url_result">绝对地址</a>
  15. <a href="/test_url_result">带'/'的相对地址</a>
  16. <a href="test_url_result">不带'/'的相对地址</a> # 浏览器解析为 http://127.0.0.1:8000/test/test_url_result
  • url 反向解析

    • url 反向解析是指在视图或者模板中,用 path 定义的名称来动态查找或计算出相应的路由

    • path 函数的语法

      • path(route, views, name="别名")
      • path('page', views.page_view, name="page_url")
      • 根据 path 中的 'name=' 关键字传给 url 确定了个唯一确定的名字,在模板或视图中,可以通过这个名字反向推断出此 url 信息
    • 模板中 - 通过 url 标签实现地址的反向解析

      1. {% url '别名' %}
      2. {% url '别名' '参数值1' '参数值2' %}
      3. ex:
      4. {% url 'pagen' '400' %} --- 传参一律是 str
      5. {% url 'person' age='18' name='gxn' %}
      • 演示:在模板中使用
      1. http://127.0.0.1:8000/test/url

      1. # mysite1/mysite1/urls.py
      2. urlpatterns = [
      3. ...
      4. # http://127.0.0.1:8000/test/url
      5. path('test/url', views.test_url),
      6. path('test_urls_result/<int:age>', views.test_url_result, name='tr') # 起别名 tr
      7. ]
      8. # mysite1/mysite1/views.py
      9. def test_url(request):
      10. return render(request, 'test_url.html')
      11. def test_urls_result(request):
      12. return HttpResponse('---test url res is ok')
      13. # mysite1/templates/test_url.html
      14. <a href="{% url 'tr' '100' %}">url反向解析版本</a> # ☆ 模板中使用别名
    • 在视图函数中 → 可调用 django 中的 reverse 方法进行反向解析

      1. from django.urls import reverse
      2. reverse('别名', args=[], kwargs={})
      3. ex:
      4. print(reverse('pagen', args=[300]))
      5. print(reverse('person', kwargs=
      6. {'name':'peng', 'age':23}))
      • 演示:

        1. http://127.0.0.1:8000/test/url
        2. # 302跳转 - 响应头里的 location 标记跳转地址

        1. # mysite1/mysite1/urls.py
        2. urlpatterns = [
        3. ...
        4. path('base_index', views.base_view, name='base_index'), # 起别名 base_index
        5. # http://127.0.0.1:8000/test/url
        6. path('test/url', views.test_url),
        7. path('test_urls_result/<int:age>', views.test_url_result, name='tr') # 起别名 tr
        8. ]
        9. # mysite1/mysite1/views.py
        10. def base_view(request):
        11. lst = ['Tom', 'Jack']
        12. return render(request, 'base.html', locals())
        13. def test_url(request):
        14. return render(request, 'test_url.html')
        15. def test_url_result(request, age):
        16. #302跳转
        17. from django.urls import reverse
        18. url = reverse('base_index') # ☆ 视图函数中使用别名
        19. return HttpResponseRedirect(url)
        20. #---------------------------------------------------------------
        21. # mysite1/templates/test_url.html
        22. <a href="{% url 'tr' '100' %}">url反向解析版本</a>
        23. # mysite1/templates/base.html

四. 总结

  • 请求(request)和响应(HttpResponseqing)
  • GET/POST处理 - request.GET/POST
  • MVC 和 MTV
  • 模板层基础配置
  • 模板变量/标签/过滤器/继承
  • url反向解析

04_Django-模板变量/标签/过滤器/继承-url反向解析的更多相关文章

  1. 巨蟒python全栈开发django4:url反向解析图解&&模板渲染

    第一部分: 1.(1)知识点回顾: django回顾: ()下载安装 输入网址,a,form表单get post,爬虫 (请求)==>django项目服务端的url(r"index/& ...

  2. Django——3 模板路径 模板变量 常用过滤器 静态文件的使用

    Django 模板路径 模板变量 过滤器 静态文件的加载 模板的路径,有两种方法来使用 设置一个总的templates在大项目外面,然后在sittings的TEMPLATES中声明 在每一个APP中创 ...

  3. Django之url反向解析

    在urls.py文件中,在进行url映射时,为请求的url命个名,以便在模板页面或者views.py视图中可以进行反向解析,同时在修改了url映射的请求路径,名称不变的情况下,不再修改模板页面或者视图 ...

  4. Django url配置 正则表达式详解 分组命名匹配 命名URL 别名 和URL反向解析 命名空间模式

    Django基础二之URL路由系统 本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11版本 ...

  5. Django url反向解析与路由分发名称空间

    url反向解析 url.py from django.conf.urls import url from django.contrib import admin from app01 import v ...

  6. Django学习笔记之Django的url反向解析

    0x00 URL反向解析和三种不同的反向解析方式 Django中提供了关于URL的映射的解决方案,可以做两个方向的使用: 1.普通解析过程:由客户端的浏览器发起一个url请求,Django根据URL解 ...

  7. django命名url与url反向解析

    1.在urls.py路由中指定别名 2.在views.py视图文件中导入from django.shortcuts import render, redirect, reverse 3.也可从这里导入 ...

  8. python 之 Django框架(路由系统、include、命名URL和URL反向解析、命名空间模式)

    12.36 Django的路由系统 基本格式: from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名) ...

  9. Django路由系统-URL命名&URL反向解析

    命名URL和URL反向解析 前言 起始样式,HTML中的href是写死的,不能更改,如下示例代码: # urls中 urlpatterns = [ url(r'^admin/', admin.site ...

随机推荐

  1. python基础知识-day8(函数实战)

    1 def out(): 2 username=input("请输入用户名:\n") 3 password=input("请输入密码:\n") 4 return ...

  2. go Cobra命令行工具入门

    简介 Github:https://github.com/spf13/cobra Star:26.5K   Cobra是一个用Go语言实现的命令行工具.并且现在正在被很多项目使用,例如:Kuberne ...

  3. 告别单调,Django后台主页改造 - 使用AdminLTE组件

    前言 之前我做了个Django的项目,为了让管理后台更加美观,我对Django(应该说是SimpleUI的)默认的Admin后台主页进行改造,具体可以看这篇文章:项目完成 - 基于Django3.x版 ...

  4. resultMap自定义映射(多对一)

    自定义resultMap,处理复杂的表关系,实现高级结果集映射 1) id :用于完成主键值的映射 2) result :用于完成普通列的映射 3) association :一个复杂的类型关联;许多 ...

  5. 静态同步方法和解决线程安全问题_Lock锁

    静态的同步方法锁对象是谁?不能是thisthis是创建对象之后产生的,静态方法优先于对象静态方法的锁对象是本类的cLass属性-->class文件对象(反射) 卖票案例出现了线程安全问题 卖出了 ...

  6. LinkedList集合和Vector集合

    LinkedList集合数据存储的结构是链表结构.方便元素添加.删除的集合.实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法 LinkedList ...

  7. List集合_介绍&常用方法和ArrayList集合

    List集合 我们掌握了Collection接口的使用后,再来看看Collection接口中的子类,他们都具备那些特性呢? 接下来,我们一起学习Collection中的常用几个子类(java.util ...

  8. CSS Houdini:用浏览器引擎实现高级CSS效果

    vivo 互联网前端团队-Wei Xing Houdini被称之为Magic of styling and layout on the web,看起来十分神秘,但实际上,Houdini并非什么神秘组织 ...

  9. antd vue 折叠面板 v-for 循环点击无效

    问题描述 实现一个折叠面板点击展开,但是必须点击两次才能展开,第一次无效 <a-collapse-panel v-for="(item, index) in dataMap" ...

  10. super详解(继承)

    //在Java中,所有的类,都默认直接或者间接继承objec类// Person 人 :父类public class Person /*extends object*/ { public Person ...