Django--模板

Posted on 2019-09-24 00:13  麻世骞  阅读(138)  评论(0编辑  收藏  举报

1、什么是模板?

  模板就是用于响应的html文件,将页面的设计和Python的代码分离开会更干净简洁更容易维护。 我们可以使用 Django的 模板系统 (Template System)来实现这种模式,这就是本章要具体讨论的问题。

2、模板语法之变量

  在视图函数中用render方法将变量以字典的方式传到模板,之后模板可以用{{'变量名'}}方式引用变量。

  views:

def index(request):

    name = 'alex'
    age =22
    students = ['alex', 'taibai', 'nvshen']
    
    return render(request, 'index.html',{'name':name, 'age':age, 'students':students}

  键值对的键名可以自己定 

  templates:

<body>
    <p>姓名{{ name }}</p>
    <p>年龄{{ age }}岁</p>
    <p>学生{{ students.0 }}</p>  #用这种方式通过索引,提取列表中的某一个元素
    <p>学生{{ students.1 }}</p>
</body>

  如果需要传大量的变量,往render中挨个写就不太方便了,所以要用locals()方法,

def index(request):

    name = 'alex'
    age =22
    students = ['alex', 'taibai', 'nvshen']
    into = {'name':'alex', 'age': 100, 'gender': 'other'}
    return render(request, 'index.html', locals())

  这样就可以将所有变量都传进去了。

3、模版之过滤器

  具体格式为{{变量|过滤器:参数}}

  default:如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:

<p>{{ book_list1|default:'没有符合条件的书籍' }}</p>

  length:返回值的长度。它对字符串和列表都起作用。例如:

{{ list|length }}

  filesizeformat:将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB''4.1 MB''102 bytes', 等等)。例如:

{{ fail_size|filesizeformat }}

  date:将时间转换为需要的格式。例如:

  views:

 value=datetime.datetime.now()

  templates:

{{ value|date:"Y-m-d" }} 

  也可以是:

{{ value|date:"Y/m/d" }} 

  slice:字符串切片。例如:

{{ value|slice:"2:-1" }}

  truncatechars:如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。例如:

  views:

shi = 'When you are old and grey and full of sleep, And nodding by the fire,take down this book, And slowly read,and dream of the soft look '

  templates:

<p>{{ shi|truncatechars:5 }}</p>

  结果为:whe...

  注意:...也要占用三个字节的位置。

  safe:Django为了安全,会自动将各种标签转译,但是有时侯我们不惜要他转译,就需要safe了。例如:

  views:(直接导入这个变量,会在界面上生成一个字符串,必须加上safe过滤器,才能生成一个a标签)

link = "<a href= 'http://www.baidu.com'>点我</a>"

  templates:

 <p>{{ link|safe }}</p>

 

4、模板的标签

for标签:遍历每一个元素。例如:

{% for person in person_list %}
    <p>{{ person.name }}</p>
{% endfor %}

  字典也可以。

{% for key,val in dic.items %}
    <p>{{ key }}:{{ val }}</p>
{% endfor %}

  for标签页游它自己的方法。

  forloop.counter:生成这个元素是第几次循环得到的。

{% for book in book_list %}
        <li>{{ forloop.counter }} {{ book }} </li>
    {% endfor %}

  forloop.counter0:同上,只是变成从0开始。

  forloop.revcounter:反过来

  forloop.revcounter0:反过来从零开始

  forloop.first:判断这个元素是不是第一次循环得到的,是的话显示True。

  forloop.last:判断这个元素是不是最后一次循环得到的,是的话显示False。

for...empty标签:for 标签带有一个可选的{% empty %} 从句,以便在给出的组是空的或者没有被找到时,可以有所操作。

{% for person in person_list %}
    <p>{{ person.name }}</p>

{% empty %}
    <p>sorry,no person here</p>
{% endfor %}

if标签:{% if %}会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。

{% if num > 100 or num < 0 %}
    <p>无效</p>
{% elif num > 80 and num < 100 %}
    <p>优秀</p>
{% else %}
    <p>凑活吧</p>
{% endif %}

  for标签中可以套if标签:

{% for person in person_list %}
    {% if person.age > 900 %}
        <p>{{ person.name }} {{ person.age }}</p>

    {% endif %}

{% endfor %}

with标签:使用一个简单地名字缓存一个复杂的变量,当你需要使用一个方法(比如访问数据库)很多次的时候是非常有用的。

{% with name=person_list.2.name  %}
    <p>{{ name }}</p>
    {% endwith %}

  这样就把person_list.2.name换存在name下了,不用每次都这么复杂的去找。

csrf_token标签:这个标签用于跨站请求伪造保护,即生成一个token,用于用户的认证。

5、模板的继承

  假如我们有多个页面的大致框架都是一样的,只是其中的个别标签不同,我们如果每个页面都将全部的模板编写出来,会有大量的重复代码,所以这个时候,为了代码的简洁,我们可以将这些重复的代码放到一个文件中,供其他模板继承使用,这个文件就称之为母版。

  在母版中,有特定的地方供其他子模板添加标签,被称之为盒子(钩子)--Blocks.

  模板base.html

 <div class="col-md-9">
                {% block contend %}
                    <h3>welcom</h3>  #子模板中如果没有内容,则返回这里的内容,子模板中如果有内容,则覆盖这里的内容。
                {% endblock %}
 </div>

  子模板index.html

{% extends 'base.html' %}


    <div class="jumbotron">
                  <h1>Hello, world!</h1>
                  <p>...</p>
                  <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
                </div>
{% endblock %}

  这里用{% extends %} 标签来告诉系统,他的母版是base.html,系统在访问index.html页面时,回先定向于base.html,注意:{% extends %} 标签必须在子模板的第一行。

  在母版中可以设置多个盒子,并且越多越好。

  如果你需要同时显示盒子里和子模板中的内容,可以用{{ block.super }}标签,

{% extends 'base.html' %}


{% block contend %}
    {{ block.super }}

    <div class="jumbotron">
                  <h1>Hello, world!</h1>
                  <p>...</p>
                  <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
                </div>
{% endblock %}

  为了更好的可读性,你也可以给你的 {% endblock %} 标签一个 名字 。例如:

{% block content %}
...
{% endblock content %}  

  不能在一个模版中定义多个相同名字的 block 标签。