Django:模板系统_模板结构优化

模板结构优化

1、有时候一些代码是在许多模板中都会用到的。如果每次都重复的去拷贝代码那肯定是不符合项目规范的。一般我们可以把这些重复性的代码抽取出来,就类似于Python中的函数一样,以后想要使用这些代码的时候就可以直接导入、调用就可以了

2、在DTL模板语法中提供了两种方法来引入其他模板:include标签和模板继承
    ⑴include标签:就是在一个模板中引用另一个模板。感觉跟Python中的函数调用类似(一个PY文件中调用另一个PY文件中的函数)
    ⑵模板继承:就是该模板继承于另一个模板,继承后子模板就拥有了父模板中的所有代码。跟Python中的类继承类似

例1:模板结构优化实例
    某个HTML代码在多个页面中都会用到


注:
1、上面图片为拉勾网中的两个不同页面,从图片中可以看出,两个页面中的页面顶部都是相同的布局(HTML代码)。如果这两个页面中都写了相同的HTML代码的话,就对后期项目维护和代码复用率有很大的阻碍

2、因此像这种情况(不同的页面中需要用到相同的代码时):就可以将相同的代码单独抽取出来放到一个地方,不同的页面在编辑时,直接调用这个共用的代码就可以了,这样代码的复用率就很高了

3、就跟Python脚本中一样:将代码函数化(面向对象编程),将经常用到的代码放到一个文件夹下,其他PY文件中需要用到时,直接导入、调用共用的函数就可以了

4、在实际中很多网站里面不同的网页,网页的顶部和底部都是一样的,只有网页中间部分是不一样的,类似于这种情况的更应该要注重代码的复用性

include标签

1、include标签允许在模板中包含其它模板的内容。标签的参数是所要包含的模板名称,可以是一个变量,也可以是用单/双引号硬编码的字符串。每当在多个模板中出现相同的代码时,就应该考虑是否要使用include标签来引入共有的代码进而减少重复

2、在很多网站中,基本上的都会有一个开头和一个结尾,在每一个网页中都会显示。相对于这种的来说,在Django中,最好的方法就是使用include的标签,在每一个模板中都加入这个开头和结尾的标签

3、可以直接使用模板的名字进行导入,例如:{% include "模板名"%}


例1:不使用include标签等方法导入模板

⑴编辑视图
    在视图函数中编辑"首页"、"公司"、"校园"三个视图函数,分别返回三个HTML模板页面

⑵编辑首页模板

⑶编辑公司模板

⑷编辑校园模板

⑸访问


注:
1、这个例子中分别实现了三个页面:这三个页面中都用到的相同的HTML代码(页面的顶部和底部,只有中间部分不一致),且三个页面中的HTML都是独立的,相互之间没有任何关系,因此代码三个页面中的代码有很大一部分是重复的

2、像这种情况的话,最好就是:将相同的代码抽取出来放到一个文件中,然后这三个页面分别调用这个公共部分的代码文件


例1_1:使用include标签导入子模板

⑴编辑顶部子模板代码

⑵编辑底部子模板代码

⑶编辑视图

⑷编辑首页模板

⑸编辑公司模板

⑹编辑校园模板

⑺访问:访问效果跟前面是一样的

注:从上面例子可以看出
1、一般情况下我们公用的都是一些HTML片段代码(不是完整的HTML代码),因此那些公用的HTML文件中存的也是一些HTML片段

2、在使用include标签引入公用的HTML片段时,就相当于在这个模板HTML代码中插入了另一个文件中的HTML代码。因此一定要注意插入的位置(include标签的使用位置)

3、include标签中的文件名参数(xxx.html)的查找路径跟一般的模板HTML文件查找路径一样:也是根templates文件夹->应用程序APP下templates文件夹

4、在include标签方法中:称为子模板的是那个被引用的HTML文件,父模板是那个引用其他文件的HTML文件

include with

1、在各个父模板中可以使用include标签来引入某个子模版(被引入的模板为子模板)。且默认情况下子模版是可以访问父模版中的变量的

2、即:如果想要在使用include标签引入子模板的时候传递一些参数,那么就可以使用"{% include '子模板名' with 变量名=值%}"

例2:引入子模板的时候传递参数
⑴编辑子模板

⑵编辑父模板:这里编辑的是公司页面

⑶访问

注:
1、如果子模板中定义了一些变量,那么父模板在引入子模板的时候可以通过"with"的方式传递变量值。如果在引入子模板的时候没有传递变量值,那么父模板是不能访问到子模板中的变量的

2、这种情景应该使用得比较少,可以了解了解

模板继承

1、在前端页面开发中,有些代码是需要重复使用的,这种情况下可以使用include标签来引用其他子模板。也可以使用另外一种比较强大的方式来实现,那就是模板继承

2、模板继承类似于Python中的类继承,在父类中可以先定义好一些变量和方法,然后在子类中实现。模板继承也是可以先在父模板中定义好一些子模板需要用到的代码,然后子模板直接继承就可以了
    ⑴继承模板:{% extends '模板名' %}。注意该标签一定要放在HTML代码最前面

3、在使用模板继承的时候,由于子模板中肯定会有自己不同的代码,因此可以在父模板中定义一个block接口,然后在子模板中实现block接口中的内容

4、理解:模板继承感觉跟include标签有点相反:
    ⑴include标签:子模板是被引用的那个模板,一般是一些公用的HTML代码片段。作用是:在父模板中插入子模板的HTML代码片段
    ⑵模板继承:子模板是引用的那个模板(父模板是被引用的那个模板,与include标签相反),一般是一个完整的HTML文件。作用是用于子模板继承父模板中的所有代码

例3:模板继承,子模板无自己的内容
⑴编辑父模板
    还是以前面的为例子,这里以校园页面为例

⑵编辑子模板

⑶访问

注:这里例子中子模板的所有内容都是继承与父模板中的,且子模板中也没有实现自己独有的那部分。这种肯定是不行的:子模板中肯定需要实现自己独有的部分,因此就需要用到block标签了
    ⑴block标签:在父模板中定义一个block标签接口,用于子模板实现自己独有的功能:{% block 标识名 %}
    ⑵{% block 标识名 %}:里面的标识名相当于这个block的名字,这个名字是必须的,为了更好的区分多个block标签。并且这个名字还可以定义在block的结束标签中{% block 标识名 %}...{% endblock 标识名 %}

例3_1:模板继承block标签
⑴编辑父模板

⑵编辑子模板

⑶访问

注:
1、相当于在父模板中使用block标签来定义一个或多个接口,子模板在继承父模板后,如果要实现自己的内容的话,就只需要实现对应的block标签即可

2、在编辑父模板的时候,还是需要注意下接口(block标签)定义的位置,因为这是子模板在对应的block标签内实现自己的功能的位置

3、上面例子中:父模板中的block标签内是没有内容的,如果父模板的lock标签内有内容,默认情况下子模板是不能继承这些内容的,如果要继承那么可以使用"{{ block.super }}"


例3_2:父模板的block标签中有内容
⑴编辑父模板

⑵编辑子模板:未使用{{ block.super }}

⑶访问:未使用{{ block.super }}
    从输出可以看出:子模板在继承父模板的时候会将父模板中block标签内的内容覆盖掉,就相当于重写了父模板中block标签内的内容

⑷编辑子模板:使用{{ block.super }}

⑸访问:使用{{ block.super }}

注:
1、在DTL模板中使用模板继承时(block标签):子模板实现自己的功能只能在block标签对内,不能将功能写在block标签对外

2、模板继承中继承语句"{% extends '文件名' %}"必须写在子模板HTML文件中的第一行

3、模板继承中:子模板是可以直接使用父模板中的参数的

例3_3:
⑴编辑父模板

⑵编辑视图

⑶编辑子模板

⑷访问

注:

上面两种方法(include标签和模板继承)就是Django DTL模板重用的方法了,在实际开发中可以根据实际情况来选择使用哪种方法。只是个人感觉使用include标签可能会简便点,比较它只是一些代码片段,在插入可能会比较方便。

发布了9 篇原创文章 · 获赞 0 · 访问量 227

猜你喜欢

转载自blog.csdn.net/zh18380113164/article/details/105055996