• Django 模板语言 标签


    前言:django的模板语法基本和flask的jinja2基本一样。下面比较一下两个模板语法的区别。

    ------深度变量的查找(万能的句点号)

    在 Django 模板中遍历复杂数据结构的关键是句点字符 (.)。

    1.模板变量

    django:{{  变量  }}    # 因为django只有一个context返回,全部数据都集中在一起

    jinja2:{{  对象.变量  }}

    2.根据列表的下标获取值

    django:{{  列表.0  }}

    jinja2:{{  列表[0]  }}

    3.根据字典的键获取字典的值

    django:{{  字典.key  }}

    jinja2:{{  字典[key]  }}或者{{  字典.key  }}

    4.for循环时取序号

    django:
    {% for item in 列表 %} {{forloop.counter}} <1-- 表示当前是第几次循环,从1开始 --> {{forloop.counter0}} <!-- 表示当前是第几次循环,从0开始 -->

    {% endfor %}

    jinja2:
    {% for item in 列表 %} {{loop.index}} <1-- 表示当前是第几次循环,从1开始 --> {{loop.index0}} <!-- 表示当前是第几次循环,从0开始 -->

    {% endfor %}


    # for遍历字典
    {{ for key,val in dic.items}}
      {{k}} : {{v}}
    {{ endfor }}
    <ul>

    {% for obj in list %} <li>{{ obj.name }}</li> {% endfor %} </ul> #在标签里添加reversed来反序循环列表: {% for obj in list reversed %} ... {% endfor %} #{% for %}标签可以嵌套: {% for country in countries %} <h1>{{ country.name }}</h1> <ul> {% for city in country.city_list %} <li>{{ city }}</li> {% endfor %} </ul> {% endfor %} #系统不支持中断循环,系统也不支持continue语句,{% for %}标签内置了一个forloop模板变量, #这个变量含有一些属性可以提供给你一些关于循环的信息 1,forloop.counter表示循环的次数,它从1开始计数,第一次循环设为1: {% for item in todo_list %} <p>{{ forloop.counter }}: {{ item }}</p> {% endfor %} 2,forloop.counter0 类似于forloop.counter,但它是从0开始计数,第一次循环设为0 3,forloop.revcounter 4,forloop.revcounter0 5,forloop.first当第一次循环时值为True,在特别情况下很有用: {% for object in objects %} {% if forloop.first %}<li class="first">{% else %}<li>{% endif %} {{ object }} </li> {% endfor %} # 富有魔力的forloop变量只能在循环中得到,当模板解析器到达{% endfor %}时forloop就消失了 # 如果你的模板context已经包含一个叫forloop的变量,Django会用{% for %}标签替代它 # Django会在for标签的块中覆盖你定义的forloop变量的值 # 在其他非循环的地方,你的forloop变量仍然可用 #{% empty %} {{li }} {% for i in li %} <li>{{ forloop.counter0 }}----{{ i }}</li> {% empty %} <li>this is empty!</li> {% endfor %} # [11, 22, 33, 44, 55] # 0----11 # 1----22 # 2----33 # 3----44 # 4----55

    5.列表为空时执行逻辑

    django:
    {% for item in 列表 %} {{forloop.counter}} {{ item }} <1-- 表示当前是第几次循环,从1开始 --> {{forloop.counter0}} {{ item }} <!-- 表示当前是第几次循环,从0开始 --> {% empty %} 列表为空或不存在时执行此逻辑 {% endfor %}

    jinja2:无

    6.if语句

    {% if num >= 100 and 8 %}
    
        {% if num > 200 %}
            <p>num大于200</p>
        {% else %}
            <p>num大于100小于200</p>
        {% endif %}
    
    {% elif num < 100 %}
        <p>num小于100</p>
    
    {% else %}
        <p>num等于100</p>
    
    {% endif %}
    
    {% if %} 标签接受and,or或者not来测试多个变量值或者否定一个给定的变量
    {% if %} 标签不允许同一标签里同时出现and和or,否则逻辑容易产生歧义,例如下面的标签是不合法的:
    
    {% if obj1 and obj2 or obj3 %} 
     

    7.过滤器

    django:变量|过滤器:参数

    jinja2:变量 | 过滤器(参数)    常见的jinja2过滤器:https://www.cnblogs.com/chichung/p/9775099.html

    django的常见几个过滤器如下:

    • safe,禁用html转义(显示html标签样式,而不是字符串)
    • length,长度,返回字符串包含字符的个数,或列表、元组、字典的元素个数。
    • default,默认值,如果变量不存在时则返回默认值。

      data|default:'默认值'
      
    • date,日期,用于对日期类型的值进行字符串格式化,常用的格式化字符如下:

      • Y表示年,格式为4位,y表示两位的年。
      • m表示月,格式为01,02,12等。
      • d表示日, 格式为01,02等。
      • j表示日,格式为1,2等。
      • H表示时,24进制,h表示12进制的时。
      • i表示分,为0-59。
      • s表示秒,为0-59。
      value|date:"Y年m月j日  H时i分s秒"
    • 1  add          :   给变量加上相应的值
         #
         # 2  addslashes   :    给变量中的引号前加上斜线
         #
         # 3  capfirst     :    首字母大写
         #
         # 4  cut          :   从字符串中移除指定的字符
         #
         # 5  date         :   格式化日期字符串
         #
         # 6  default      :   如果值是False,就替换成设置的默认值,否则就是用本来的值
         #
         # 7  default_if_none:  如果值是None,就替换成设置的默认值,否则就使用本来的值
      
      
      #实例:
      
      #value1="aBcDe"
      {{ value1|upper }}<br>
      
      #value2=5
      {{ value2|add:3 }}<br>
      
      #value3='he  llo wo r ld'
      {{ value3|cut:' ' }}<br>
      
      #import datetime
      #value4=datetime.datetime.now()
      {{ value4|date:'Y-m-d' }}<br>
      
      #value5=[]
      {{ value5|default:'空的' }}<br>
      
      #value6='<a href="#">跳转</a>'
      
      {{ value6 }}
      
      {% autoescape off %}
        {{ value6 }}
      {% endautoescape %}
      
      {{ value6|safe }}<br>
      
      {{ value6|striptags }}
      
      #value7='1234'
      {{ value7|filesizeformat }}<br>
      {{ value7|first }}<br>
      {{ value7|length }}<br>
      {{ value7|slice:":-1" }}<br>
      
      #value8='http://www.baidu.com/?a=1&b=3'
      {{ value8|urlencode }}<br>
          value9='hello I am yuan'

    8.多行注释

    django:

    {% comment %}
    ...
    {% endcomment %}

    9.对有需要的block进行重写

    django:

    • 不用重写父模版中的所有block,如果子模版没有重写,则使用父模版定义的默认值。
    • 可以使用 block.super 来包含父模板的块中定义的内容,如下

    {% block 名称 %}
          子模板的内容
          {{ block.super }}    显示父模板中block的内容
    {% endblock %}

    {{ block.super }}——引用上级代码块在其基础上进行一些修改

    flask:

    同样原理,不过用的是{{  super()  }}

     

    10.csrf_token

         用于生成csrf_token的标签,用于防治跨站攻击验证。注意如果你在view的index里用的是render_to_response方法,不会生效

         其实,这里是会生成一个input标签,和其他表单标签一起提交给后台的。

    {% csrf_token %} 放到form中

    11.引用路由配置地址 {% url %}

    1.
    urlpatterns = [ url(r'^register.html$', register, name="register"), ] 2.
    <form action="{% url "register" %}" > <input type="text"> <input type="submit"value="提交"> {%csrf_token%} </form>

    12.用更简单的变量名替代复杂的变量名 {% with %}

    {% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %}

    13.{% load %}: 加载标签库

        {% load staticfiles %}
        <script src="{% static 'plugins/jquery.min.js' %}"></script>

    14.自定义tag标签

    ------a、在app中创建templatetags模块(必须的)
    
    ------b、创建任意 .py 文件,如:my_tags.py
    
    from django import template
    from django.utils.safestring import mark_safe
    
    register = template.Library()   #register的名字是固定的,不可改变
    
    
    @register.filter
    def filter_multi(v1,v2):
        return  v1 * v2
    
    
    @register.simple_tag
    def simple_tag_multi(v1,v2):
        return  v1 * v2
    
    
    @register.simple_tag
    def my_input(id,arg):
        result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
        return mark_safe(result)
    
    
    
    ------c、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py :{% load my_tags %}
    
    ------d、使用simple_tag和filter(如何调用)
    
    
    -------------------------------.html
    {% load xxx %}   #首行
        
        
        
        
     # num=12
    {{ num|filter_multi:2 }} #24
    
    {{ num|filter_multi:"[22,333,4444]" }}
    
    
    {% simple_tag_multi 2 5 %}  参数不限,但不能放在if for语句中
    {% simple_tag_multi num 5 %}
    
    
    ------e、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.
    
    注意:
    
    filter可以用在if等语句后,simple_tag不可以
    
    {% if num|filter_multi:30 > 100 %}
        {{ num|filter_multi:30 }}
    {% endif %}
    

    CP https://www.cnblogs.com/chichung/p/9898017.html

  • 相关阅读:
    二维数组和指向指针的指针
    多路复用构建高性能服务器
    disque概要
    漫谈云计算与SOA (1)
    zeromq
    自定义内存分配
    基于行的操作
    反应器类型的操作
    多个流,简短的读和写
    缓存
  • 原文地址:https://www.cnblogs.com/icemonkey/p/10506574.html
Copyright © 2020-2023  润新知