首页 > 其他分享 >Django框架基础5

Django框架基础5

时间:2023-04-22 19:46:34浏览次数:41  
标签:index reverse 框架 url 标签 基础 Django block 模板

本节知识重点:

  1、判断变量值是否相等(equal)

  2、extends模板继承标签

  3、load加载标签或过滤器

  4、模板继承的应用(block与extends)

  5、路由分发函数(include)

  6、url标签实现反向解析(先app_name='index',再{% url %})

  7、reverse()函数实现反向解析(重定向)

  8、命名空间namespace(namespace='first')

一、Django模板标签完整攻略

  前面我们重点讲解了模板语言中使用频率较高到的三个标签 if、for 以及 url。

  本节我们将其余标签选择性的讲解。

  学习 Django 框架的时候,要学会抓住知识重点,这是提高学习效率的一种有效途径。

1、判断变量值是否相等

  判断两个变量的值是否相等,也是一种很常见的需求。

  我们使用 ifequal 标签来进行判断,它与 endifequal 标签成对出现,当然也可以使用 if 标签配合比较运算符来实现,所以这个标签也显的很鸡肋,Django官方的解释是,为了简化操作过程所以提供了这个标签,所以这就要看大家的喜好,自己决定是否使用它吧。

  它的语法格式如下:

{% ifequal n1 n2 %}
...代码块1
{% else %}
...代码块2
{% endifequal %}

  n1 与 n2 的值相等的,那么就执行代码块 1,如果不等就执行代码块 2,示例如下:

{% ifequal n1 n2 %}
    <p>{{ n1 }} equal {{ n2 }}</p>
{% else %}
    <p>{{ n1 }} not equal {{ n2 }} </p>
{% endifequal %}

  此处的 n1与 n2 的值属于模板变量,如使用硬编码时也可以是整数、小数或者字符串。

  但是 Python 的字典类型、列表类型、布尔类型,不能用在 {% ifequal %} 中。

2、extends模板继承标签

  extends 标签表示模板继承的标签,它通常会与{ block }标签一起使用,有具体两种使用法:

  • {% extends "base.html" %} 继承名为 "base.html" 的父模板;

  • {% extends variable %} 使用 variable 变量表示的模版。

  模板继承在 Django 模板语言中也是非常重要的知识,我们将会对其做单独的讲解。

3、load加载标签或过滤器

  load 标签用于在模板中加载自定义模板标签集或者过滤器,可以加载项目中的静态文件,格式使用如下:

{% load static %} 加载静态文件

4、csrf_token标签使用

  一个防止 CSRF 攻击(跨站点请求伪造)的标签,对于 CSRF 攻击可以参见百度百科《跨站请求伪造》自行了解,不过此标签在后续相关章节还会使用到。

二、模板语言的注释

  如同 HTML 和其他的语言例如 Python 一样,Django 模板系统也允许注释。 注释使用{# #}的格式。

示例如下:

{# This is a comment #}

  注释的内容不会在模板渲染时输出,但是在很多情况下,由于要注释的内容非常多并且需要跨行,比如要增加代码逻辑描述等,这时使用这方式就不是很方便。为了解决上述问题,Django 提供了 comment 标签,用来快速实现多行注释,使用方法如下:

{% comment %}
...要被注释的内容放在两个标签中间
{% endcomment %}

三、Django模板继承

  在本节我们讲述模板语言中最后一个知识点,也是最重要的,那就是模板继承。

  模板继承和 Python 语言中类的继承含义是一样的,在 Django 中模板只是一个文本文件,如 HTML。

  那模板继承到底是是什么呢?如何在 Django 中使用它呢?让我们一起一探究竟。

1、模板继承的概念

  模板继承是 Django 模板语言中最强大的部分。模板继承使你可以构建基本的“骨架”模板,将通用的功能或者属性写在基础模板中,也叫基类模板或者父模板。子模板可以继承父类模板,子模板继承后将自动拥有父类中的属性和方,我们还可以在子模板中对父模板进行重写,即重写父模板中方法或者属性,从而实现子模板的定制。模板继承大大提高了代码的可重用性,减轻开发人员的工作量。

2、模板继承的应用

  那么模板继承如何使用呢?它的使用场景有哪些呢?最典型的应用是 Web 站点的头部信息和尾部信息,比如 Web 站点的底部广告,每个网页都需要放底部广告,还有 Web 站点的头部导航栏,这些都可以使用模板继承来实现。

  在模板继承中最常用了标签就是 {% block %} 与 {% extends %} 标签,其中 {% block% } 标签与 {% endblock %} 标签成对出现,而 {% extends %} 放在子模板的第一行且必须是模板中的第一个标签,标志着此模板继承自父模板,它们使用方法如下所示:

#定义父模板可被重写内容
{% block block_name %}
...可以被子模板覆盖的内容
{% endblock block_name %}

#继承父模板
{% extends '父模板名称' %}

#子模板重写父模板
{% block block_name %}
...子模板覆盖后呈现的新内容
{% endblock block_name %}

  需要注意的是子模板不需要重写父模板中的所有 block 标签定义的内容,未重写时,子模板原封不动的使用父模板中的内容。下面我们通过一个简单的例子来看一下具体的实现过程。

  首先在 templates/index 目录下定义父模板 base.html,代码如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}Welcome to 乔治老师的课堂 {% endblock title %}</title>
</head>
<body>
    <!--区域1默认区域不可以被子模板修改-->
    <p>亲爱的同学您好:</p>
    <hr>
    
    <!--区域2可以被子模板重写-->
    {% block content %}
        <p>这是主体内容可以被子模板重写</p>
    {% endblock content %}
    <hr>
    
    <!--区域3可以被子模板重写-->
    {% block footer %}
        <p>这是结尾的内容也可以被重写</p>
    {% endblock footer %}
</body>
</html>

  然后在父模板同级路径下定义子模板文件 test.html,代码如下所示:

{% extends 'index/base.html' %}
<!--重写title-->
{% block title %} 欢迎你学习Django教程 {% endblock %}

<!--区域1保持父模板默认状态-->

<!--对父模板的区域2进行重写-->
{% block content %}
{% for item in course %}
<li>{{ item }}</li>
{% endfor %}
{% endblock content %}

{% block footer %}
    <p>最后希望<span style="color:green">{{ name }}</span>可以学有所成</p>
{% endblock footer %}

  在 index/views.py 文件编写视图函数,如下所示:

# 定义父模板视图函数
def base_html(request):
    return render(request, 'index/base.html')


# 定义子模板视图函数
def index_html(request):
    name = 'xiaoming'
    course = ['python', 'django', 'flask']
    return render(request, 'index/test.html', locals())

  然后更新子路由,代码如下所示:

# 127.0.0.1:8000/index/test 访问子模板
path('test/', views.index_html),
# 127.0.0.1:8000/index/base 访问父模板
path('base/', views.base_html)

  在浏览器地址栏输入父模板 url 地址进行访问,得到的结果如下所示:

  我们在父模板中标记了哪些区域可以被子模板重写覆盖,现在我们访问子模板地址.

看看它又是如何的呢?展示结果如下所示:

  我们可以看出,子模板对父模板中 {% block %} 包含的内容进行了重写覆盖,这就是模板继承应用。如果在多个模板中出现了大量复杂的代码,那么就应该考虑使用模板继承来减少重复性代码。

3、总结归纳

  本节介绍了模板继承的使用,以及它的优势,Django 官网建议,在父模板中应尽量多的使用 {% block %} 标签,这样可以给我们更多的选择空间。本节知识点总结如下:

  • block 标签需要成对出现,使用 {{ endblock }} 作为结束标签;

  • 定义 block 标签名字,子模板中具有同样名称的 block 块完成对父模板的替换;

  • 子模板不需要定义父模板中的所有 block,未定义时,子模板将原样使用父模板中的内容;

  • 子模板需要使用 {% extends %} 标签继承父模板,且必须是模板中的第一个标签,并放在文件的第一行;

四、Django路由反向解析与命名空间

1、路由分发函数

  在实际开发过程中,一个Django 项目会包含很多的 app ,这时候如果我们只在主路由里进行配置就会显得杂乱无章,所以通常会在每个 app 里,创建各自的 urls.py 路由模块,然后从根路由出发,将 app 所属的 url 请求,全部转发到相应的 urls.py 模块中。而这个从主路由转发到各个应用路由的过程叫做路由的分发,而它的实现是使用include() 函数来完成的,如下所示:

from django.urls import path,include
from BookStore import views
urlpatterns = [path('index/',include('index.urls'))]

  从主路由的 urls.py 中使用 include 函数将其关联到 index 应用的路由模块。

2、什么是反向解析

  我们知道每个视图函数都有一个和其相对应的路由,但是如果它们之间的匹配关系发生了变化,那么与之对应的访问地址也需要跟着发生改变,这是极其不方便的。因此我们可以用一种动态解析 url 的方法来避免。我们使用 Path 语法提供的 name 属性给对应路由起别名,从而让与之对应的链接或者跳转,会根据这个别名来动态解析 url,这个动态解析 url 路径的过程就是反向解析。

  在处理业务需求的过程中,当我们遇到重定向或在模板中需要链接到其他的视图函数,在这两种场景下我们就会使用到 url 的反向解析,而不使用硬编码的方式将 url 放在模板中。这样做的优势在于当 URL 发生变化后,也无须我们更改模板中的 URL。

3、反向解析的应用

  在需要解析 URL 的地方,Django 提供了不同的方式来实现 URL 反向解析:

  • 在模板层使用 {% url %} 模板标签;

  • 在视图函数的 Python 代码中:使用 reverse() 函数;

  • 在处理模型 model 类实例时:使用 get_absolute_url() 方法。

我们对前两种方法进行实例讲解,第三种方法了解即可。首先我们需要在 index/urls.py 路由文件中对 index 应用进行注册,使用如下方式来完成注册:

app_name='index'   #写在开始位置即可

(1)使用url标签实现反向解析

  在index/urls.py 的路由列表中给 test/ 添加相应的 name 参数,如下所示:

from django.urls import path
from index import views

app_name='index'
urlpatterns=[
	path('test/',views.index_html,name='detail_hello'),
]

  然后在 templates/index 目录下新建 newtest.html 并编写如下代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <a href=" {% url 'index:detail_hello' %}">点击继续</a>
    <p>一起去酒吧嗨翻天。</p>
</body>
</html>

  最后在 index\views.py 编写视图函数并配置相应路由映射,如下所示:

#视图函数
def redict_url(request):
    return render(request,'index/newtest.html')

#路由映射
urlpatterns=[
    path('redict/',views.redict_url),
]

  最终通过访问 http://127.0.0.1:8000/index/redict/ 可以实现反向解析页面跳转

(2)reverse()函数实现反向解析

  • 重定向

  reverse() 函数是在视图函数中实现反向解析的一种方式,它通常与配合 HttpResponseRedirect(http 重定向) 一起使用。我们再结合上面的例子来讲解,那么它理解与使用起来就会非常的简单,首先我们 index/views.py 中定义一个视图函数,如下所示:

from django.http import HttpResponseRedirect
from django.urls import reverse

#reverse函数实现反向解析重定向到我们想要的有页面
def test_to_reverse(request):
    return HttpResponseRedirect(reverse('index:detail_hello'))

#在index/urls.py中为视图函数配置路由 
urlpatterns=[
    path('test/',views.index_html,name='detail_hello'), 
    path('reverse/',views.test_to_reverse)
]

注意:在分发式路由中使用 index:detail_hello 也就是“应用名:url 别名”,如果不是分发式路由可以直接使用 url 别名,即 reverse('detail_hello')

最后访问 http://127.0.0.1:8000/index/reverse/ 可以直接重定向到 http://127.0.0.1:8000/index/test/

(3)reverse()函数简析

  上面我们使用 reverse 函数完成了视图函数的重定向,但是这里还要给大家简单介绍一下 reverse() 函数。在 Django中 reverse() 的定义如下所示:

reverse(viewname,urlconf=None,args=None,kwargs=None,current_app=None)

  它只有一个必填参数,其他都是可选参数。其中 viewname 参数除了可以接受 url 路由 name 的别名以外,还可以接受可调用视图函数对象作为参数。示例如下:

from BookStore import views
def test_to_reverse(request):
    return HttpResponseRedirect(reverse(views.test_url))

其他参数说明如下:

  • urlconf:这个属性用于决定当前的反向解析使用哪个 URLconf 模块,默认是根 URLconf;

  • args:它用于传递参数,可以是元组或者列表,顺序填充 url 中的位置参数;

  • kwargs:字典类型的传参,和 args 作用一样;

  • current_app:它指定当前视图函数所在的 app,本例中是 index 应用。

4、命名空间namespace

  我们知道一个 Django 项目中可以创建多个应用,每个应用又可以定义很多的视图函数,所以就会有很多的 url 路由映射(简称 url 模式),在这种情况下给 url 命名就难免会发生命名冲突, Django 为了解决这一问题,为开发者提供了命名空间功能即 namespace。url 命名空间使得即使在不同的应用(app)中定义了相同的 url 名称,也能够正确的实现 url 反向解析。

  URL 命名空间分为两个部分:第一,应用命名空间即使用 app_name 关联应用名字;第二,使用 namespace 用来标识一个应用的实例,主要功能是区分同一个应用中不同的实例。

  下面为了让大家更好的理命名空间的概念,我们对本节的示例进行改写,首先在主路由 BookStore/urls.py 的 url 模式列表中,使用 namespace 参数给 index 应用添加命名空间。如下所示:

urlpatterns = [  
	path('index/',include('index.urls', namespace='first'))
]

  在 index 应用的 urls.py 中添加(若之前已经添加则无需再重新添加)如下所示:

app_name="index"

  最后改写 index 应用的test_to_reverse()视图函数,如下所示:

def test_to_reverse(request):
    return HttpResponseRedirect(
    	reverse('index:detail_hello',current_app=request.resolver_match.namespace)
    )

  经过上面的设置我们就完成了 index 应用的命名空间操作,这样即使是不同的应用存在相同 url 名称,Django 也能精准的解析我们想要的 url 路径。

  url 的反向解析是个重要的知识点,它可以帮助我们在不同应用之间实现页面的跳转以及视图的重定向,所以我们要熟练的掌握并应用它们。

标签:index,reverse,框架,url,标签,基础,Django,block,模板
From: https://www.cnblogs.com/LoLong/p/17343758.html

相关文章

  • 视觉SLAM:模型介绍、算法框架及应用场景
    目录01 什么是SLAM 1.1 相机模型1.2 相机运动1.3建图02SLAM算法框架03SLAM的应用场景3.1自动驾驶的高精度定位3.2自主移动机器人知识扩展:组合导航(GNSS/INS)二维码导航/磁导航3.3室内场景的三维重建:AR(增强现实技术)等04 结语参考文献:本文主要想使用尽量少的专业词汇来解释......
  • Forest-声明式HTTP客户端框架-集成到SpringBoot实现调用第三方restful api并实现接口
    场景Forest声明式HTTP客户端API框架,让Java发送HTTP/HTTPS请求不再难。它比OkHttp和HttpClient更高层,是封装调用第三方restfulapiclient接口的好帮手,是retrofit和feign之外另一个选择。通过在接口上声明注解的方式配置HTTP请求接口。官网:Forest 代码地址:forest:声明式HTTP客户......
  • Django笔记十二之defer、only指定返回字段
    本文首发于公众号:Hunter后端原文链接:Django笔记十二之defer、only指定返回字段本篇笔记将介绍查询中的defer和only两个函数的用法,笔记目录如下:deferonly1、deferdefer的英语单词的意思是延迟、推迟,我们可以通过将字段作为参数传入,可以达到在获取数据的时候指定不获......
  • Django 知识库:path()路径映射
    网站地址是由统一资源定位符表示的,也是就我们常说的url。Django中有非常强大的path()方法,可以动态构造出你想要的各种不同形态的url。基本写法如下:fromdjango.urlsimportpathurlpatterns=[#固定地址path('articles/2003/',...),#可传入int参......
  • Django—Form两种解决表单数据无法动态刷新的方法
    一、无法动态更新数据的实例#Createyourmodelshere.classClasses(models.Model):title=models.CharField(max_length=32)def__str__(self):returnself.titleclassTeacher(models.Model):name=models.CharField(max_length=32)t2c=model......
  • 代理工具实战基础,SQL注入漏洞测试
    在Web安全课程中,“插件”是能够增强或丰富原有工具功能的小程序Firebug为Firefox浏览器提供了更加丰富的开发者工具箱(网络审查页面元素)HackBar为Firefox浏览器提供快速构造HTTP请求及多种编码变换的功能(构造数据包)AdvacedCookieManager:编辑Cookie类插件为Firefox浏览器提供快速修......
  • 汽车安全系统基础芯片(SBC)系列产品MFS2630AMDA0AD可适应其他面向汽车电气化的微控制
    MFS2630AMDA0ADFS26是汽车安全系统基础芯片(SBC)系列产品,具有多电源,支持入门级和中档安全微控制器(如S32K3系列),同时保持了灵活性,可适应其他面向汽车电气化的微控制器,如动力系统、底盘、功能安全和低端网关应用。FS26具有多个开关式稳压器以及LDO稳压器,可为微控制器、传感器、外设......
  • USB | USB基础知识
    USB|USB基础知识......
  • Java基础知识点API之Object
    一:概述Object是java中的顶级父类,所有的父类都直接或间接地继承于Object类。Object类中的方法可以被所有子类访问,所以我们要学习Object类和其中的方法。二·:OBject的构造方法及其常用的成员方法publicObject()//空参构造classStudent(){privateStringname;private......
  • 人工智能的预训练基础模型的分类
    预训练基础模型预训练基础模型是指在大规模语料库上进行预训练的通用人工智能模型。在自然语言处理(NLP)领域,这些模型通常是基于深度神经网络的语言模型,可以用于各种任务,如文本分类、命名实体识别、机器翻译等。目前,人工智能领域的预训练基础模型主要有以下几种:BERT(Bidirectiona......