目录

    模板

    模版是纯文本文件 ,可以生成任何基于文本的文件格式,比如HTML,XML ,CSV等。Django模版语言致力于在性能和简单性上取得平衡 。Django的模版系统并不是简单的将Python嵌入到HTML中。

    下面是一个小模版,它展示了一些基本的元素。

    {% 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 %}

    注意:
        调用对象里面的方法的时候,不需要写括号来执行 ,并且只能执行不需要传参数的方法 ,如果你的这个方法需要传参数,那么模板语言不支持,不能帮你渲染

    每一个Web框架都需要一种很便利的方法用于动态生成HTML页面 。 最常见的做法是使用模板。模板包含所需HTML页面的静态部分 ,以及一些特殊的模版语法,用于将动态内容插入静态部分。

    Django可以配置一个或多个模板引擎(语言),也可以不用引擎 。Django自带一个称为DTL(Django Template Language )的模板语言 ,以及另外一种流行的Jinja2语言(需要安装,pip install Jinja2) 。

    Django为加载和渲染模板定义了一套标准的API,与具体的后台无关。加载指的是 ,根据给定的模版名称找到的模板然后预处理,通常会将它编译好放在内存中。渲染则表示,使用Context数据对模板插值并返回生成的字符串 。

    语法
    变量相关的用{{}} ,逻辑相关的用{%%}。

    模板渲染的官方文档:(https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#std:templatetag-for)

    本文参考官方文档,即用的是DTL引擎。

    Django模板语言的语法包括四种结构:变量、标签 、过滤器、注释 。

    变量

    变量的值来自context中的数据字典, 类似于字典对象的keys到values的映射关系。

    在Django的模板语言中按此语法使用:{{ 变量名 }}。当模版引擎遇到一个变量,它将从上下文context中获取这个变量的值 ,然后用值替换掉它本身 。 变量的命名包括任何字母数字以及下划线的组合。变量名称中不能有空格或标点符号。

    深度查询据点符(.)在模板语言中有特殊的含义 。当模版系统遇到点(".") ,它将以这样的顺序查询:

    1. 字典查询(Dictionary lookup),字典键查找优先于方法查找。
    2. 属性或方法查询(Attribute or method lookup)
    3. 数字索引查询(Numeric index lookup)

    注意事项:

    1. 如果计算结果的值是可调用的,它将被无参数的调用。 调用的结果将成为模版的值 。
    2. 如果使用的变量不存在 , 模版系统将插入 string_if_invalid 选项的值, 它被默认设置为'' (空字符串) 。
    3. {{ foo.bar }}这种模版表达式中的“bar”,如果在模版上下文中存在 ,将解释为一个字面意义的字符串而不是使用变量bar的值 。

    标签

    模版语言中的标签类似Python中的函数,可以输出内容、控制结构,甚至可以访问其他的模板标签。

    {% csrf_token %} # csrf令牌标签 ,用于POST提交 。

    部分标签需要使用起始和闭合标签。 

    for循环标签

    循环对象中每个元素。需要结束标签{% endfor %}  。

    显示athlete_list中提供的运动员列表:
    <ul>
    {% for athlete in athlete_list %}
        <li>{{ athlete.name }}</li>
    {% endfor %}
    </ul>

    循环对象points的每个元素都是(x,y)这样的二元元组,并返回:
    {% for x, y in points %}
        There is a point at {{ x }},{{ y }}
    {% endfor %}

    访问一个字典中的键值:
    {% for key, value in data.items %}
        {{ key }}: {{ value }}
    {% endfor %}

    可以使用{% for obj in list reversed %}进行反向循环。

    下面是Django为for标签内置的一些属性,可以当作变量一样使用{{ }}在模版中使用。

    forloop.counter:循环的当前索引值 ,从1开始计数;常用于生成一个表格或者列表的序号

    forloop.counter0:循环的当前索引值,从0开始计数;

    forloop.revcounter: 当前循环的倒序索引值(最后一个为1

    forloop.revcounter0  当前循环的倒序索引值(最后一个为0

    forloop.first:判断当前是否循环的第一次,是的话 ,该变量的值为True 。

    forloop.last:如果这是最后一次循环 ,则为真

    forloop.parentloop:对于嵌套循环,返回父循环所在的循环次数。

    for … empty

    for标签带有一个可选的{% empty %}从句,以便在循环对象是空的或者没有被找到时 ,可以有所操作和提示。

    <ul>
    {% for athlete in athlete_list %}
        <li>{{ athlete.name }}</li>
    {% empty %}      # 若列表为空,则执行 。
        <li>Sorry, no athletes in this list.</li>
    {% endfor %}
    </ul>

    if-elif-else标签

    需要{% endif %}结束标签。

    {% 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标签支持 and  、or、==、> 、< 、!=、<=、>= 、in、not in、is 、is not判断等多种运算符,注意条件两边都有空格。也可使用过滤器 。

    {% if somevar == "x" %}
      This appears if variable somevar equals the string "x"
    {% endif %}

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

    # 注意 ,大多数模版过滤器都返回字符串类型,所以使用过滤器做整数类型的比较通常是错误的,但length是一个例外 。

    操作符都可以组合以形成复杂表达式。操作符的优先级从低至高如下:

    or
    and
    not
    in
    == ,!=,<,> ,<= ,>=
    与Python的规则是一样的。

    如果想要不同的优先级,那么需要使用嵌套的if标签 ,而不能使用圆括号 。比较运算符不能像Python或数学符号中那样“链接 ”。

    {% if a > b > c %}  (错误的用法)
    {% if a > b and b > c %} (正确的用法)

    {% if athlete_list and coach_list %}
        Both athletes and coaches are available.
    {% endif %}

    {% if not athlete_list %}
        There are no athletes.
    {% endif %}

    {% if athlete_list or coach_list %}
        There are some athletes or some coaches.
    {% endif %}

    {% if not athlete_list or coach_list %}
        There are no athletes or there are some coaches.
    {% endif %}

    {% if athlete_list and not coach_list %}
        There are some athletes and absolutely no coaches.
    {% endif %}

    with

    使用一个简单地名字缓存一个复杂的变量 ,多用于给一个复杂的变量起别名。当需要使用一个代价较大的方法(比如访问数据库)很多次的时候这是非常有用的 。

    像这样:

    {% with total=business.employees.count %}
        {{ total }} <!--只能在with语句体内用-->
    {% endwith %}
    或:
    {% with business.employees.count as total %}
        {{ total }}
    {% endwith %}

    可以分配多个变量:

    {% with alpha=1 beta=2 %}
        ...
    {% endwith %}

    注意等号左右不要加空格。

    csrf_token

    若不使用此标签以post方式提交表单时,会报错。如果在settings里面的中间件配置里把csrf的防御机制给注销,则不会报错 ,但不安全 。这个标签用于跨站请求伪造保护。

    本文版权归QU快排Www.seoGurubLog.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系QQ▲61910465