zoukankan      html  css  js  c++  java
  • Django--模板

    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 标签。

      

        

     

      

  • 相关阅读:
    mfc窗口,父窗口parentwindow,所有者窗口ownerwindow 区别
    svn冲突问题详解 SVN版本冲突解决详解
    input的on(‘input’,function(0{})事件
    input 输入框两种改变事件的方式
    JSON格式
    AJAX的dataType问题
    什么是跨域请求?
    JSON.parse()和JSON.stringify()使用介绍
    .replace(/-/g,"/")的用法
    docker 实践(一)
  • 原文地址:https://www.cnblogs.com/490144243msq/p/11575994.html
Copyright © 2011-2022 走看看