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一次

  • 相关阅读:
    求随机数平均值方法 求随机数方差方法 求正态分布的随机数
    combox 绑定
    winform界面textbox框 鼠标经过时出现浮动
    Regex
    C# 3.0 一行求方差
    通过Linq 实现DataTable Group By
    ORACLE 时间运算
    发布几个国外的XHTML模板站,DIV+CSS模板下载
    C# 3.0新特性系列:隐含类型var
    在NTier 或多层应用程序中使用ADO.NET Entity Framework
  • 原文地址:https://www.cnblogs.com/jolin123/p/4343054.html
Copyright © 2011-2022 走看看