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

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

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


一. 模板层 - 变量和标签

变量

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

样例:

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

# mysite1/mysite1/urls.py
urlpatterns = [
...
path('test_html', views.test_html)
] # mysite1/mysite1/views.py
def test_html_param(request):
dic = {}
dic['int'] = 88
dic['str'] = 'peng'
dic['lst'] = ['Tom', 'Jack', 'Lily']
dic['dict'] = {'a':9, 'b':8}
dic['func'] = say_hi
dic['class_obj'] = Dog()
dic['script'] = '<script>alert(1111)</script>'
return render(request, 'test_html_param.html', dic) def say_hi():
return 'hahaha' class Dog:
def say(self):
return 'wangwang' # mysite1/templates/test_html_param.html
<h3>int 是 {{ int|add:"2" }}</h3>
<h3>str 是 {{ str|upper }}</h3>
<h3>lst 是 {{ lst }}</h3>
<h3>lst 是 {{ lst.0 }}</h3>
<h3>dict 是 {{ dict }}</h3>
<h3>dict['a'] 是 {{ dict.a }}</h3>
<h3>function 是 {{ func }}</h3>
<h3>class_obj 是 {{ class_obj.say }}</h3>
<h3>script 是 {{ script|safe }}</h3>

标签

模板标签

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

if标签

  • 语法
{% if 条件表达式1 %}
...
{% elif 条件表达式2 %}
...
{% elif 条件表达式3 %}
...
{% else %}
...
{% 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

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

# mysite1/mysite1/urls.py
urlpatterns = [
...
path('test_if_for', views.test_if_for),
] # mysite1/mysite1/views.py
def test_if_for(request):
dic = {}
dic['x'] = 20
dic['lst'] = ['Tom', 'Jack', 'Lily']
return render(request, 'test_if_for.html', dic) # mysite1/templates/test_if_for.html
{% if x > 10 %}
今天天气很好
{% else %}
今天天气非常好
{% endif %} <br> {% for name in lst %}
{% if forloop.first %} &&&&& {% endif %}
<p> {{ forloop.counter }} {{ name }}</p>
{% if forloop.last %} ===== {% endif %}
{% empty %}
当前没数据
{% endfor %}
  • 模板标签 - if标签 - 练习

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

    • 前端参考代码:

    • 演示:

    http://127.0.0.1:8000/mycal

    # 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标签

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

# mysite1/mysite1/urls.py
urlpatterns = [
...
path('test_if_for', views.test_if_for),
] # mysite1/mysite1/views.py
def test_if_for(request):
dic = {}
dic['lst'] = ['Tom', 'Jack', 'Lily']
return render(request, 'test_if_for.html', dic) # mysite1/templates/test_if_for.html
{% for name in lst %}
{% if forloop.first %} &&&&& {% endif %}
<p> {{ forloop.counter }} {{ name }}</p>
{% if forloop.last %} ===== {% endif %}
{% empty %}
当前没数据
{% endfor %}

小节

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

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

过滤器

  • 定义:在变量输出时对变量的值进行处理
  • 作用:可以通过使用 过滤器 来改变变量的输出显示
  • 语法:{{ 变量 | 过滤器1:'参数1' | 过滤器2:'参数2' ... }}

官方文档:https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/

  • 常用过滤器:

  • 演示:

http://127.0.0.1:8000/test_html_param

# mysite1/mysite1/urls.py
urlpatterns = [
...
path('test_html', views.test_html)
] # mysite1/mysite1/views.py
def test_html_param(request):
dic = {}
dic['int'] = 88
dic['script'] = '<script>alert(1111)</script>'
return render(request, 'test_html_param.html', dic) def say_hi():
return 'hahaha' class Dog:
def say(self):
return 'wangwang' # mysite1/templates/test_html_param.html
<h3>int 是 {{ int|add:"2" }}</h3>
<h3>str 是 {{ str|upper }}</h3>
<h3>script 是 {{ script|safe }}</h3>

继承

模板的继承

​ 如下样例:

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

  • 语法 - 父模板中:

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

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

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

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

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

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

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

http://127.0.0.1:8000/base_index

# mysite1/mysite1/urls.py
urlpatterns = [
...
path('base_index', views.base_view, name='base_index'),
path('music_index', views.music_view),
path('sport_index', views.sport_view),
] # mysite1/mysite1/views.py
def base_view(request):
lst = ['Tom', 'Jack']
return render(request, 'base.html', locals()) def music_view(request):
return render(request, 'music.html') def sport_view(request):
return render(request, 'sport.html') #-------------------------------------------------------------
# mysite1/templates/base.html # 父模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{% block mytitle %}
<title>主页</title> # 子模板能改的地方
{% endblock %}
</head>
<body>
{{ lst }} # 子模板无法继承变量(动态内容)
<a href="/music_index">音乐频道</a> # 子模板不能改
<a href="/sport_index">体育频道</a>
<br> {% block info %}
这是主页 # 子模板能改的地方
{% endblock %} <br> <h3>有任何问题联系xxxx</h3> # 子模板不能改 # mysite1/templates/music.html # 子模板
{% extends 'base.html' %} # 继承父模板 {% block mytitle %}
<title>音乐频道</title> # 子模板重写block
{% endblock %} {% block info %}
欢迎来到音乐频道
{% endblock %} # mysite1/templates/sport.html
{% extends 'base.html' %} {% block mytitle %}
<title>体育频道</title>
{% endblock %} {% block info %}
欢迎来到体育频道
{% 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
  • 演示:

http://127.0.0.1:8000/test/url

# mysite1/mysite1/urls.py
urlpatterns = [
...
# http://127.0.0.1:8000/test/url
path('test/url', views.test_url),
path('test_url_result', views.test_url_result)
] # mysite1/mysite1/views.py
def test_url(request):
return render(request, 'test_url.html') def test_url_result(request):
return HttpResponse('---test url res is ok') # mysite1/templates/test_url.html
<a href="http://127.0.0.1:8000/test_url_result">绝对地址</a>
<a href="/test_url_result">带'/'的相对地址</a>
<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 标签实现地址的反向解析

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

      # 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 方法进行反向解析

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

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

        # 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反向解析

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. ssh隧道连接的方式连接数据库

    最好用xshell做隧道连接,其他工具没接触过过 1.先新建一个会话 2.点进刚刚建好的连接,右击属性 3.点进隧道,添加,输入映射到本地的配置 4.完成之后用数据库连接工具连接即可 参考连接: ht ...

  2. BUUCTF-webshell后门

    webshell后门 老方法,D盾直接查杀. flag{ba8e6c6f35a53933b871480bb9a9545c}

  3. Spring框架系列(6) - Spring IOC实现原理详解之IOC体系结构设计

    在对IoC有了初步的认知后,我们开始对IOC的实现原理进行深入理解.本文将帮助你站在设计者的角度去看IOC最顶层的结构设计.@pdai Spring框架系列(6) - Spring IOC实现原理详解 ...

  4. 疫情在校学生之——用python对某校园热水服务app进行测试,实现自动免费用水(仅供参考)

    写在前面的过场话: 本文只是对某校园热水服务app做个测试,其实本人并没有做大坏事,并未传播相关技术,文章以下内容的敏感部分会打码,并且相关厂商已经正在进行漏洞修复,大家看看就好.文章后会提供&quo ...

  5. HMS Core音频编辑服务3D音频技术,助力打造沉浸式听觉盛宴

    2022年6月28日,HDD·HMS Core.Sparkle影音娱乐沙龙在线上与开发者们见面.HMS Core音频编辑服务(Audio Editor Kit)专家为大家详细分享了基于分离的3D音乐创 ...

  6. idea部署项目运行没问题,但是页面404。

    解决方案: 这个位置不要添加内容. 参考:https://blog.csdn.net/hupixiong/article/details/105443606

  7. 有关golang信道的面试笔记

    信道是一个goroutine之间很关键的通信媒介. 理解golang的信道很重要,这里记录平时易忘记的.易混淆的点. 1. 基本使用 刚声明的信道,零值为nil,无法直接使用,需配合make函数进行初 ...

  8. SQL练习六--More JOIN operations

    movie Field name Type Notes id INTEGER An arbitrary unique identifier title CHAR(70) The name of the ...

  9. 【摸鱼神器】UI库秒变低代码工具——表单篇(二)子控件

    上一篇介绍了表单控件,这一篇介绍一下表单里面的各种子控件的封装方式. 主要内容 需求分析 子控件的分类 子控件属性的分类 定义 interface. 定义子控件的的 props. 定义 json 文件 ...

  10. Python 元类详解

    一.Type介绍 在Python中一切皆对象,类它也是对象,而元类其实就是用来创建类的对象(由于一切皆对象,所以元类其实也是一个对象). 先来看这几个例子: 例1: In [1]: type(12) ...