DTL语法(Django Template Language)

django的template语法(简称DTL),认识一下,知道有这样的语法!需要时再来查。
266阅读 · 2020-7-15 00:05发布

模板继承

  • {% extends 'base.html' %},使用模板继承可以共用base.html中的代码。

变量

  • {{ variable }},获取变量名variable的值,变量不能以下划线开头
  • {{ variable.name }},通过 ==.== 获取变量的属性

注释

  • {# #},注释代码
    {# test #}
      {# {% if xxx %}aaa{% endif %} #}
    

过滤器

  • {{ value|add:"2" }},字符串或列表相加,字符串会变成整数相加。
  • {{ first|add:second }},第一个变量加上第二个变量。
  • {{ value|addslashes }},将单引号前面加上\,例如I'm using Django变成i\'m using django。
  • {{ value|capfirst }},首字母大写。
  • {{ value|center:"15" }},15个占位符居中对齐。
  • {{ value|ljust:"10" }},10个占位符左对齐。
  • {{ value|rjust:"10" }},10个占位符右对齐。
  • {{ value|cut:" " }},移除所有的空格。
  • {{ value|date:" D d M Y" }},参考连接
  • {{ value|default:"nothing" }},如果value是False的话,使用默认值。
  • {{ value|default_if_none:"nothing" }},如果value是None的话,使用默认值。
  • {{ value|dictsort:"name" }},对列表中的多个字典进行排序。

    # 举例
      [
          {'name':'zed','age':10},
          {'name':'amy','age':20},
          {'name':'joe','age':15}
      ]
    
      # 结果
      [
          {'name':'amy','age':20},
          {'name':'joe','age':15},
          {'name':'zed','age':10}
      ]
    
  • {{ value|dictsortreversed:0 }},反向排序,0是数字下标,以目标序列中的第几个来排序。
  • {{ value|divisibleby:"3" }},value是能否被3整除,返回True或者False。
  • {{ value|filesizeformat }},文件大小变成直观的可读方式,value是123456789,变成117.7MB。
  • {{ value|first }},返回列表的第一个元素或字符串的第一个字符。
  • {{ value|last }},返回列表的最后一个元素或字符串的最后一个字符。
  • {{ value|get_digit:"2" }},从右往左取第二位。
  • {{ value|join:" // " }},使用字符串连接列表,例如['a','b','c']变为"a // b // c"。
  • {{ value|json_script:"id-data" }},django2.1版本后支持的过滤器,将value变为script标签中的值(便于js接收这个值)

    # view
      from django.shortcuts import render
    
      def hello(request):
          content = {'value':{'test':'1234567891'}}
          return render(request,'test.html',content)
    
      # template
      {{ value|json_script:"test_id_a" }}
    
      # 将会变成如下内容
      <script id="test_id_a" type="application/json">{"test": "1234567891"}</script>
    
      # js获取值
      var value = JSON.parse(document.getElementById('test_id_a').textContent);
    
  • {{ value|length }},返回列表或字符串的长度。
  • {{ value|length_is:"4" }},判断长度是否为4,返回True或者False。
  • {{ value|linebreaks }},将Python/nDjango变成\<p>Python\<br>Django\</p>
  • {{ value|linebreaksbr }},将Python/nDjango变成Python\<br>Django
  • {{ value|linenumbers }},给值加上序号。
  • {{ value|make_list }},将数字或字符串转换为列表。例如"abc"变成['a', 'b', 'c']
  • {{ value|random }},字符串或列表中随机获取一个。
  • {{ value|safe }},对value关闭自动转义。
  • {{ some_list|safeseq|join:"," }},对列表中的每一个对象关闭自动转义。
  • {{ value|slice:":2" }},获取序列的前两个元素。
  • {{ value|slugify }},将词使用-进行连接,只支持英文。
  • {{ value|stringformat:"E" }},科学计数法表示。
  • {{ value|striptags }},过滤掉html中的标签。
  • {{ blog_date|timesince:comment_date }},人性化的时间显示。
  • {{ value|title }},标题大写。
  • {{ value|truncatechars:9 }},截取字符串,超过6位后显示...
  • {{ value|truncatechars_html:9 }},截取html标签中的字符串,超过6后面变成...
  • {{ value|truncatewords:2 }},截取字单词,超过6后面会变成...
  • {{ value|truncatewords_html:2 }},截取html标签中的单词,超过6后面变成...
  • {{ value|upper }},字母变大写。
  • {{ value|lower }},字母变小写。
  • {{ value|urlencode }},url编码。
  • {{ value|urlizetrunc:9 }},例如check out www.baidu.com会变成check out \<a href="http://www.baidu.com" ref="nofollow">www.ba...\</a>。
  • {{ value|wordcount }},统计单词个数。
  • {{ value|wordwrap:5 }},每一行限定多少个,超过就换行。

标签

  • for循环标签
    {% for x in value %} 
          {{ x }}
      {% endfor %}
    
  • for...empty标签
    {% thumbnail article.image "100x100" as im %} 
          {{ im.url }}
      {% empty %}
          
      {% endthumbnail %}
    
  • if、elif、else判断标签
    {% if value %}
          test1
      {% elif value2 %}
          test2
      {% else %}
          test3
      {% endif %}
    
  • 条件判断==,!=,<,>,<=,>=,in,not in,is,is not。
  • {% comment %},注释内容
  • {% csrf_token %},提交表单用。
  • cycle循环常量或者变量,在循环中使用。
    {% for i in test_list %}
          {% cycle 'test1' 'test2' %}
          aaaa
      {% endfor %}
    
  • resetcycle重置为第一个开始循环。
  • extends继承父模板。
    {% extends "./base.html" %}
      {% extends "../my/base.html" %}
    
  • filter过滤器,使用单个或多个过滤器。
    # 开启转义然后变成小写
      {% filter force_escape|lower %}
          Test aaa.
      {% endfilter %}
    
  • firstof输出第一个为True的值。
    {% firstof var1 var2 var3 %}
    
  • ifchange用于判断变量是否发生更改。
  • include加载模板或内容到当前页面。
    {% include 'foo/bar.html' %}
      {% include template_name %}
    
  • load加载模板标签。
  • lorem随机展示内容,模板网站中会使用到。
    {% lorem [count] [method] [random] %}
      # method有w(单词)、p(html段落)、b(文本段落)
    
  • now展示当前日期或者时间。
  • spaceless移除html中的空格、tab和换行。(变成一行,压缩了)
    {% spaceless %}
          <p>
              <a>aaa</a>
          </p>
      {% endspaceless %}
    
  • verbatim圈中的内容中,禁止使用Django模板引擎。
    {% verbatim %}
          {% if aaa %} test {% endif %}
      {% endverbatim %}
    
  • with命名并缓存变量,当值为变量时不会多次查询数据库。
    {% with total=business.employees.count %}
          {{total}}employee {{ total|pluralize }}
      {% endwith %}
    

HTML转义

Django的Template默认开启自动转义(既不会执行代码中的HTML语句)。

  • {{ article.get_markdown |safe }},safe关键字关闭自动转义,会执行get_markdown属性中的html语句。
  • {% autoescape off %}{% endautoescape %},关闭一个区域内的自动转义。
    {% autoescape off %}
          test aaaa.
          {% autoescape on %}
              test bbbb.
          {% endautoescape %}
          test cccc.
      {% endautoescape %}
    
  • {{ title|escape }},对变量开启转义。
    {% autoescape off %}
          {{ title|escape }}
      {% endautoescape %}
    

方法调用

  • 方法的api可以通过属性的方式调用。
    {% for tag in article.tags.all %}
          {{ tag }}
      {% endfor %}
    

自定义标签和过滤器

自定义过滤器的使用

  1. 在setting.py中的INSTALLED_APPS中添加django.contrib.humanize
  2. 在前端上方导入
    {% load humanize %}
    
  3. 使用自定义过滤器
    {{ news.created_at|naturaltime }}
    

参考资料

Django开发企业实战面向就业升级(中高级教程),Jack