(4)Django学习——模板标签定义及语法:for循环,if判断,页面跳转,开启关闭自动转义,url携带参数传递,注释;模板的继承及引用!!!

1.常用标签

(1)模板标签重要概念:

1.定义:标签在渲染的过程中提供任意的逻辑

注意:(这个定义是刻意模糊的。 例如,一个标签可以输出内容,作为控制结构,例如“if”语句或“for”循环从数据库中提取内容,甚至可以访问其他的模板标签。)

2.标签语法: 由 {% 和 %} 来定义的,例如:{%tag%} {%endtag%}

(2)常用模板标签讲解及使用:

1.模板标签中的for循环:

①music应用下的views.py文件
模拟从数据库中得到的数据:

def test01(request):
    li=["第一条数据", "第二条数据", "第三条数据", "第四条数据", "第五条数据", "第六条数据","第七条数据", "第八条数据",]
    return render(request,"test02.html",context={
     "li":li})

②对应的前端html模板文件test02.html
在此模板中使用模板标签中的for循环

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        p{
     
            width: 100px;
            color: aqua;
            height: 40px;
            line-height: 40px;
            background-color: skyblue;
        }
    </style>
</head>
<body>

{
     #如果直接使用模板变量这样是列表形式在前端显示:#}
{
     {
      li }}

{
     #使用模板标签中的for循环遍历之后就可以使用html对其进行排版了:#}
<div>
    {
     % for foo in li %}
        <p>{
     {
      foo }}</p>		{
     #foo是循环出来的每一条数据,通过循环对每条数据都进行排版!#}
    {
     % endfor %}
</div>

</body>
</html>

③前端实现:
(4)Django学习——模板标签定义及语法:for循环,if判断,页面跳转,开启关闭自动转义,url携带参数传递,注释;模板的继承及引用!!!_第1张图片

2.模板标签中的if判断:

①music应用下的views.py文件

{
     #模拟从前端接收到的用户登录与否的状态信息!#}
def test01(request):
    b=True
    return render(request,"test02.html",context={
     "b":b})

②对应的前端html模板文件test02.html
在此模板中使用模板标签中的for循环

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

{
     #简单实现注册登录以及登录成功的判断:#}
{
     #模拟用户浏览网页时,如果登录的话显示用户名名;如果未登录的话显示注册 登录。#}
{
     % if b %}
    <div>欢迎小明</div>
{
     % elif b == "123" %}		{
     #只是演示下如何进行多重判断,在此处无实际用处!#}
    啊哈
{
     % else %}
    <div>注册 登录</div>
{
     % endif %}

</body>
</html>

③前端实现:
(4)Django学习——模板标签定义及语法:for循环,if判断,页面跳转,开启关闭自动转义,url携带参数传递,注释;模板的继承及引用!!!_第2张图片

3.模板标签中的页面跳转:

①music应用下的urls.py文件(在这里我们可以给相应的url路径取个name属性值,这个值是唯一的!!!)

from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [     #子路由
    path('test01/',views.test01),
    path('sing/',views.sing,{
     "name":"小明","age":18},name="bb"),
]

②对应的前端html模板文件test02.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

{
     #实现本地网页的跳转:#}
{
     #第一种方法:#}
{
     #第一个例子:跳转到首页#}
<a href="http://127.0.0.1:8888">首页1</a>      {
     # 如果直接写首页路径,今后万一咱的域名改变了,那么所有跳转的都要跟着一个个改,太麻烦啦! #}
<a href="/">首页2</a>                            {
     # 这种方法就避免了刚刚说的情况!  /代表的就是当前的ip地址加端口号:http://127.0.0.1:8888 #}

{
     #第二个例子:跳转到带有路径的html界面#}
<a href="http://127.0.0.1:8888/music/sing/">跳转1</a>     {
     # 这样也可能会出现刚刚说的那种情况 #}
<a href="/music/sing">跳转2</a>                             {
     #  这样不会出现刚刚说的那种情况,但是如果咱对应url的路径进行了改变,也会产生与刚刚类似的情况#}

{
     #第二种方法:   不管域名或者路径如何改变,name值不变就不需要改变,简单#}
<a href="{% url 'bb' %}">跳转3</a>		{
     #通过url的name属性值跳转到对应的页面!#}

</body>
</html>
4.模板标签中的开启和关闭自动转义(是否让html标签在前端中生效!):

①music应用下的views.py文件

def test01(request):
    html1='

拉拉

'
html2='

拉拉

'
html3='

拉拉

'
html4='

拉拉

'
return render(request,"test02.html",context={ "h1":html1,"h2":html2,"h3":html3,"h4":html4})

②对应的前端html模板文件test02.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

{
     #如果我们使用过滤器的话,那么一次只能识别一个,如果数量非常多的话,工作量就太大了!#}
{
     {
      h1|safe }}

{
     #所以模板标签为我们解决了这个问题,不管需要开启自动转义的有多少个,位置分的有多散,只要将其包裹在下面的两行代码之内,都可开启其的自动转义!#}
{
     % autoescape off %}
	{
     {
      h1 }}
	{
     {
      h2 }}
	{
     {
      h3 }}
{
     % endautoescape %}

</body>
</html>
4.模板标签中的url携带参数传递

(前面通过转换器可以实现借由url进行参数传递;现在模板标签也可以进行参数传递!)
在这里插入图片描述
(4)Django学习——模板标签定义及语法:for循环,if判断,页面跳转,开启关闭自动转义,url携带参数传递,注释;模板的继承及引用!!!_第3张图片

5.模板标签中的注释:

(4)Django学习——模板标签定义及语法:for循环,if判断,页面跳转,开启关闭自动转义,url携带参数传递,注释;模板的继承及引用!!!_第4张图片

2.模板的继承与引用


网站中有些不同的页面当中有些数据是完全一模一样的;
有些数据是不一样的但是前端的排版格式是一模一样的

Django模版引擎中最强大也是最复杂的部分就是模版继承了。 模版继承可以让你创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。

(1)首先,看一个例子:(同一个站点下有三个html模板,样式如下!!!)

①第一个html模板:

a_first.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *{
     
            margin: 0;
            padding: 0;
        }
        .top{
     
            height: 200px;
            background: darkgoldenrod;
        }
        .con{
     
            height: 500px;
            background: aqua;
        }
        .but{
     
            height: 150px;
            background: sandybrown;
        }
    </style>
</head>
<body>
<div>
    <div class="top">头部</div>
    <div class="con">内容一</div>
    <div class="but">底部</div>
</div>
</body>
</html>

前端实现:
(4)Django学习——模板标签定义及语法:for循环,if判断,页面跳转,开启关闭自动转义,url携带参数传递,注释;模板的继承及引用!!!_第5张图片

②第二个html模板:

a_second.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *{
     
            margin: 0;
            padding: 0;
        }
        .top{
     
            height: 200px;
            background: darkgoldenrod;
        }
        .con{
     
            height: 500px;
            background: aqua;
        }
        .but{
     
            height: 150px;
            background: sandybrown;
        }
        .con .left{
     
            width: 70%;
            float: left;
            height: 100%;
            background: red;
        }
        .con .right{
     
            width: 30%;
            float: left;
            height: 100%;
            background: #352fff;
        }
    </style>
</head>
<body>
<div>
    <div class="top">头部</div>
    <div class="con">
        <div class="left">内容二</div>
        <div class="right">广告</div>
    </div>
    <div class="but">底部</div>
</div>
</body>
</html>

前端实现:
(4)Django学习——模板标签定义及语法:for循环,if判断,页面跳转,开启关闭自动转义,url携带参数传递,注释;模板的继承及引用!!!_第6张图片

③第三个html模板:

a_third.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *{
     
            margin: 0;
            padding: 0;
        }
        .top{
     
            height: 200px;
            background: darkgoldenrod;
        }
        .con{
     
            height: 500px;
            background: aqua;
        }
        .but{
     
            height: 150px;
            background: sandybrown;
        }
        .con .left{
     
            width: 70%;
            float: left;
            height: 100%;
            background: #f338ff;
        }
        .con .right{
     
            width: 30%;
            float: left;
            height: 100%;
            background: #24ff44;
        }
    </style>
</head>
<body>
<div>
    <div class="top">头部</div>
    <div class="con">
        <div class="left">内容三</div>
        <div class="right">广告</div>
    </div>
    <div class="but">底部</div>
</div>
</body>
</html>

前端实现:
(4)Django学习——模板标签定义及语法:for循环,if判断,页面跳转,开启关闭自动转义,url携带参数传递,注释;模板的继承及引用!!!_第7张图片

(2)不难看出,这三个前端界面头部和底部是一模一样的;后两个的中间内容部分右侧也都是广告页面。而我们为了实现这三个html界面分别码了那么多重复的代码,费时费力,考虑到类可以继承,那么咱的html模板能否继承呢?答案是肯定的,下面咱们来使用模板的继承看一看可以给咱节省多少精力:

(4)Django学习——模板标签定义及语法:for循环,if判断,页面跳转,开启关闭自动转义,url携带参数传递,注释;模板的继承及引用!!!_第8张图片

①编写父级模板base.html:(编写父级模板原则:相同的部分直接编写代码,使子模板直接继承[模板继承使用extends标签实现];不同的部分通过使用block来给子模板开放接口,使子模板可以进行覆写[模板覆写使用block标签实现])
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *{
     
            margin: 0;
            padding: 0;
        }
        .top{
     
            height: 200px;
            background: darkgoldenrod;
        }
        .con{
     
            height: 500px;
            background: aqua;
        }
        .but{
     
            height: 150px;
            background: sandybrown;
        }
        .con .right{
     
            width: 30%;
            float: left;
            height: 100%;
            background: #352fff;
        }
    </style>
    {
     % block style %}{
     % endblock %}			  {
     #让子模板可以对css样式进行覆写!#}
</head>
<body>
<div>
    <div class="top">头部</div>
    <div class="con">
        {
     % block con %}
            {
     % block left %}

            {
     % endblock %}

            {
     % block right %}
                <div class="right">广告</div>
            {
     % endblock %}
        {
     % endblock %}
    </div>
    <div class="but">底部</div>
</div>
</body>
</html>
②第一个html模板:

a_first.html文件:

{
     % extends 'music/base.html' %}


{
     % block con %}
    内容一
{
     % endblock %}

②第二个html模板:

a_second.html文件:

{
     % extends 'music/base.html' %}

{
     % block style %}
    <style>
            .con .left{
     
            width: 70%;
            float: left;
            height: 100%;
            background: red;
        }
    </style>
{
     % endblock %}

{
     % block left %}
    <div class="left">内容二</div>
{
     % endblock %}

②第三个html模板:

a_third.html文件:

{
     %  extends 'music/base.html' %}

{
     % block style %}
    <style>
        .con .left{
     
            width: 70%;
            float: left;
            height: 100%;
            background: #f338ff;
        }
        .con .right{
     
            width: 30%;
            float: left;
            height: 100%;
            background: #24ff44;
        }
    </style>
{
     % endblock %}

{
     % block left %}
    <div class="left">内容三</div>
{
     % endblock %}

(3)经过Django实现会发现跟上面不使用模板继承效果一模一样!!!而且咱的代码简洁太多 。来总结一下模板的继承及引用:

模板继承使用extends标签实现。通过使用block来给子模板开放接口。
1、extends必须是模板中的第一个出现的标签。
2、子模板中的所有内容,必须出现在父模板定义好的block中,否则django将不会渲染。
3、如果出现重复代码,就应该考虑使用模板。
4、尽可能多的定义block,方便子模板实现更细的需求。
5、如果在某个block中,要使用父模板的内容,使用block.super获取。

你可能感兴趣的:(Django,django,python)