Python框架篇之Django(Template模版:标签tag、自定义filter、extend模板继承)

一、标签的使用(tag)

1、语法格式:{% tags %}

2、提供的几种标签

  • {% if %}:计算一个变量值,如果是“true”,即它存在、不为空并且不是false的boolean值,系统则会显示{% if %}和{% endif %}间的所有内容
{% if ani.age > 25 %}
    <h1>{{ ani.name }},you have a lot of responsibilities!</h1>
{% elif ani.age >= 18 %}
    <h1>{{ ani.name }},you have been an adult!</h1>
{% else %}
    <h1>You just a child!</h1>
{% endif %}
  • {% for %}:允许你按顺序遍历一个序列中的各个元素,每次循环模板系统都会渲染{% for %}和{% endfor %}之间的所有内容
{#for循环#}
{#注意:for是没有办法拿到索引的,只能用forloop.counter来拿#}
{% for name in li %}
    <h3>{{ forloop.counter }}{{ name }}</h3>
    <h4>{{ forloop.revcounter }}{{ name }}</h4>
{% endfor %}

{% for name in li %}
    {% if forloop.first %}
{#        创建一个列表标签,并且带有class为first的标签背景色变红#}
        <li class="first">
    {% else %}
        <li>
    {% endif %}
        {{ name }}
    </li>
    {% empty %}
        <h1>没有相关文章!</h1>
{% endfor %}
  • {%csrf_token%}:用于生成csrf_token的标签,用于防治跨站攻击验证。
  • {% url %}:引用路由配置的地址
{#{% url  %}引用路由配置地址#}
<form action="{% url 'login' %}" method="post">
    <p>账号:<input type="text"></p>
    <p>密码:<input type="text"></p>
    <p><input type="submit"></p>
    {% csrf_token %}
{#    一种Django的安全机制,相当于给页面加上了一个身份证——一串编码,有了这个才可以正常跳转到url 'login'页面#}
</form>
  • {% with %}:用更简单的变量名替代复杂的变量名
{% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %}
  • {% verbatim %}:禁止render
{% verbatim %}
         {{ hello }}
{% endverbatim %}
  • {% load %}: 加载标签库

二、自定义filter和simple_tag

1、自定义filter过滤器

  • a、首先在app中创建templatetags模块
  • b、然后创建任意 .py 文件,如:myTag.py
  • c、套用引用代码:
from django import template
from django.utils.safestring import mark_safe

register = template.Library()   #register的名字是固定的,不可改变
  • d、编写自定义的函数
    11
  • e、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py :{% load my_tags %}
  • f、在html中调用:由于filter函数只接收两个参数,因此此处只能传入一个参数,可以是列表、字典
<h1>filter:{{ ani.age|filter_muti:3 }}</h1>

2、自定义simple_tag:
可以传任意个参数,用空格隔开
simple_tag_muti函数已经在上图展示了,这里直接调用

<h1>simple_tae:{% simple_tag_muti 26 2 10%}</h1>

3、注意:

  • a、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag
  • b、filter可以用在if等控制语句后,simple_tag不可以
{% if num|filter_multi:30 > 100 %}
    {{ num|filter_multi:30 }}
{% endif %}

三、extend模板继承

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

2、extend继承模板标签
在整个网站中,如何减少共用页面区域(比如站点导航)所引起的重复和冗余代码?
比如,如果有一个更典型的网站,它有导航条、样式表,可能还有一些 JavaScript 代码,事情必将以向每个模板填充各种冗余的 HTML 而效率低下。
传统解决方法是使用 服务器端的 includes ,你可以在 HTML 页面中使用该指令将一个网页嵌入到另一个中。 事实上, Django 通过刚才讲述的 {% include %} 支持了这种方法。

3、extend 的本质
模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载。

4、继承的步骤
(1) 创建 base.html 模板,在其中定义站点的主要外观感受。 这些都是不常修改甚至从不修改的部分。
(2) 为网站的每个区域创建 base_SECTION.html 模板(例如, base_photos.html 和 base_forum.html )。这些模板对base.html 进行拓展,幷包含区域特定的风格与设计。
(3)为每种类型的页面创建独立的模板,例如论坛页面或者图片库。 这些模板拓展相应的区域模板。
这个方法可最大限度地重用代码,并使得向公共区域(如区域级的导航)添加内容成为一件轻松的工作

5、继承后的修改

{#继承base.html#}
{% extends 'base.html' %}

{#修改样式:前提是base里面也必须有{% block style %}#}
{% block styles %}
    <style>
        h2{
            background-color: yellowgreen;
        }
    </style>
{% endblock %}

{#但是有一部分需要修改,则只能改{{ block  }}里的内容#}
{% block content %}
{#    获取父类#}
    {{ block.super }}

    {% for s in student_list %}
        <h2>学生{{ s }}</h2>
    {% endfor %}
{% endblock %}

22

6、extend继承注意

  • 如果在模板中使用 {% extends %} ,必须保证其为模板中的第一个模板标记。 否则,模板继承将不起作用。

  • 一般来说,基础模板中的 {% block %} 标签越多越好。 记住,子模板不必定义父模板中所有的代码块,因此你可以用合理的缺省值对一些代码块进行填充,然后只对子模板所需的代码块进行(重)定义。

  • 如果发觉自己在多个模板之间拷贝代码,你应该考虑将该代码段放置到父模板的某个 {% block %} 中。
    如果你需要访问父模板中的块的内容,使用 {{ block.super }}这个标签吧,这一个魔法变量将会表现出父模板中的内容。 如果只想在上级代码块基础上添加内容,而不是全部重载,该变量就显得非常有用了。

  • 不允许在同一个模板中定义多个同名的 {% block %} 。 存在这样的限制是因为block 标签的工作方式是双向的。
    也就是说,block 标签不仅挖了一个要填的坑,也定义了在父模板中这个坑所填充的内容。如果模板中出现了两个相同名称的 {% block %} 标签,父模板将无从得知要使用哪个块的内容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章