zoukankan      html  css  js  c++  java
  • django template language入门

    django_template

    The Django template language

    template模板是一个简单的文本文件,可以生成文本格式(HTML,XML,CSV) 模板包含变量,这些变量将会被赋值

    例如:

    {% extends "base_generic.html" %}
    
    {% block title %}{{ section.title }}{% endblock %}
    
    {% block content %}
    <h1>{{ section.title }}</h1>
    
    {% for story in story_list %}
    <h2>
      <a href="{{ story.get_absolute_url }}">
        {{ story.headline|upper }}
      </a>
    </h2>
    <p>{{ story.tease|truncatewords:"100" }}</p>
    {% endfor %}
    {% endblock %}
    
    Variables

    {{ variable }} 这种形式的就是变量。当模板引擎看到一个变量,会给它赋值并用赋值的结果来替换它。dot(.)号可以访问变量的属性 如 {{ section.title }} 将会用sectioon对象的title属性来替换 如果有不存在的变量,模板会插入TEMPLATE_STRING_IF_INVALID,默认是''空字符串 "bar" : {{ foo.bar }} 这种会被表示成字符串而不会使用bar的值去替换

    Filters

    过滤器用来修改变量以输出 {{ name|lower }} 将会将name变量以小写形式输出 过滤去可以串起来用,如 {{ text|excape|linebreaks }}

    过滤器也可以带参数,如: {{ bio|truncatewords:30 }} 输出bio变量的前30个字母

    参数如果包含空格则必须用引号括起来,如以逗号和一个空格的形式将一个list连起来: {{ list|join:", " }}

    • default: 如果变量是错误或者空的,将会使用默认值,如: {{ value|default:"nothing" }}
    • length: 返回变量的长度,可用于list或者string
    • filesizeformat: 将数值格式化为字节大小,如'13 KB', '4 MB'等,如 {{ 123456789|filesizeformat }} 输出117.7 MB
    Tags

    {% tag %} tags比变量稍微复杂,可以生成文本输出,可以控制逻辑和循环,也可以将一些外部信息导入模板以后给变量使用

    一些标签包括开始和结束标签,形如{% tag %} tag content {% endtag %}

    • for: 控制循环,访问列表中每个元素,eg:
      <ul>
      {% for athlete in athlete_list %}
          <li>{{ athlete.name }}</li>
      <% endfor %>
      </ul>
      

    上面这个for标签可以访问列表中的每个运动员,它包括开始和结束标签

    • if, elif, else
      {% if athlete_list %}
          Number of athletes: {{ athlete_list|length }}
      {% elif athlete_in_locker_room_list %}
          Athletes should be out of the locker room soon!
      {% else %}
          No athletes.
      {% endif %}
      

    if标签可以和过滤器还有一些运算符一起使用:

    {% if athlete_list|length > 1 %}
       Team: {% for athlete in athlete_list %} ... {% endfor %}
    {% else %}
       Athlete: {{ athlete_list.0.name }}
    {% endif %}
    
    Comments

    {# #} eg: {# greeting #}hello 内容只有hello

    Template inheritance

    这是django模板最强大也是最复杂的部分,允许我们创建一个基础的骨架模板,包含网站的基础元素,然后我们可以定义子模板来进行重载 base.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <link rel="stylesheet" href="style.css" />
        <title>{% block title %}My amazing site{% endblock %}</title>
    </head>
    
    <body>
        <div id="sidebar">
            {% block sidebar %}
            <ul>
                <li><a href="/">Home</a></li>
                <li><a href="/blog/">Blog</a></li>
            </ul>
            {% endblock %}
        </div>
    
        <div id="content">
            {% block content %}{% endblock %}
        </div>
    </body>
    </html>
    

    一个子模板:

    {% extends "base.html" %}
    
    {% block title %}My amazing blog{% endblock %}
    
    {% block content %}
    {% for entry in blog_entries %}
        <h2>{{ entry.title }}</h2>
        <p>{{ entry.body }}</p>
    {% endfor %}
    {% endblock %}
    

    这里用了extend标签表明是从基础模板扩展来的,模板引擎检测到base.html中的几个block标签,就会用子模板中这些blocks的内容进行替换,得到这样一个输出:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <link rel="stylesheet" href="style.css" />
        <title>My amazing blog</title>
    </head>
    
    <body>
        <div id="sidebar">
            <ul>
                <li><a href="/">Home</a></li>
                <li><a href="/blog/">Blog</a></li>
            </ul>
        </div>
    
        <div id="content">
            <h2>Entry one</h2>
            <p>This is my first entry.</p>
    
            <h2>Entry two</h2>
            <p>This is my second entry.</p>
        </div>
    
    </body>
    </html>
    

    注意:

    • 如果使用extends标签,则它必须是文本中的第一个模板标签
    • 有时候我们想对parent模板中的内容进行一些修改,可以通过{{ block.super }}来得到这些内容
    Automatic HTML escaping

    有时候用户提交的数据会有无法想象的事情发生,如Hello, {{ name }}看起来只是简单的显示用户名,但是如果用户输入的名字是<script>alert('hello')</script> 则模板会渲染成:

    Hello, <script>alert('hello')</script>
    

    会导致浏览器弹出提醒框! 这会使网页存在被攻击的漏洞,如XSS(Cross Site Scripting)攻击等

    django提供两种方案来解决这个问题

    • 一种是给一些不信任的变量添加escape过滤器,使它们变得没有危害,但问题是我们需要自己手动来设置而且容易产生遗漏
    • 第二种是让django自动来escape

    几种常见escape:

    < &lt;
    &gt;
    ' &#39;
    " &quot;
    & &amp;

    这些都是默认转换的,只要使用django的模板系统就行

    关闭escape

    对于单个变量,可以使用safe过滤器,如:

    This will be escaped: {{ data }}
    This will not be escaped: {{ data|safe }}
    

    如果data的内容是'<b>',则输出:

    This will be escaped: &lt;b&gt;
    This will not be escaped: <b>
    

    对于blocks,可以使用autoescape标签,如:

    {% autoescape off %}
        Hello {{ name }}
    {% endautoescape %}
    

    autoescape默认是on

    load标签

    一些应用提供一些标签和过滤器的库,如果要在模板中访问他们,首先要保证这个应用是在INSTALLED_APPS的,如'django.contrib.humanize',访问intcomma过滤器

    {% load humanize %}
    {{ 45000|intcomma }}
    

    注意在base.html中load的应用不能直接应用到子模板,在子模板中必须再load一次

  • 相关阅读:
    准备 FRM 考试——方法、工具与教训
    930. 和相同的二元子数组 前缀和
    1906. 查询差绝对值的最小值 前缀和
    剑指 Offer 37. 序列化二叉树 二叉树 字符串
    815. 公交路线 BFS
    518. 零钱兑换 II dp 完全背包
    1049. 最后一块石头的重量 II dp
    5779. 装包裹的最小浪费空间 二分
    5778. 使二进制字符串字符交替的最少反转次数 字符串 滑动窗口
    474. 一和零 dp
  • 原文地址:https://www.cnblogs.com/jolin123/p/4343054.html
Copyright © 2011-2022 走看看