zoukankan      html  css  js  c++  java
  • Python学习第123天(Django回头看:模板控制语句、filter、simple_tag)

      紧接着昨天的内容,今天我们来说说模板语句的内容,关于模板语句,核心就是{ % 语句 % }

      先说一下if  else的使用

    { % if 判定语句 % }  { % endif % }

      如果判定结果为true,则会执行其判定语句之后的html标签内容:

    例子:

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

    总的来说,和我们Python中的if  else完全相同

    下面是for循环

      { % for % }  { % endfor % }

    每次循环模板系统都会渲染{% for %}和{% 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 %}

      其中涉及到empty,如果该循环为空,则empty下面的html标签进行执行,多用于提示搜索为空,我们制定搜索的过程中,往往反馈一个列表,我们通过遍历裂变,但部分时候也可能搜索结果为空,此时就可以通过empty进行反馈

      而forloop.counter和 foeloop.revcounter则可以显示在模板语言中被隐藏掉的序号,后面加上0就是包括0的情况,不写则从1开始计算

      forloop.first则用于给第一个特殊标识,比如遍历文章,给题目一个特殊的标识

    csrf_token标签:这个标签很重要,保证了我们反馈的信息内容路劲是反馈给我们文件的信息路径

      在form标签内增加{%csrf_token%}

      该标签可以生成特殊识别代码,只有保证与后端第一次反馈过去的标签一致,才能接收到所提供的的数据,以保证数据不会被提交至其他的位置。

    例子  

    <form action="{% url "bieming"%}" >
              <input type="text">
              <input type="submit"value="提交">
              {%csrf_token%}
    </form>

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

      不多说,很方便,减少你写的长度:

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

    {% verbatim %}: 禁止render

      是这部分不被渲染,正常显示大括号  

    {% verbatim %}
             {{ hello }}
    {% endverbatim %}

    下面就到了关键部分了,自定义filter和simple_tag

      filter是单个参数的函数,而simple_tag则可以使用多个参数,但是前者需要{ 参数|函数:参数 }的方式,simple_tag不需要,其使用{ { 函数名 参数1 参数2 参数3.。。 } }参数之间通过逗号分开

      使用方法:

    1、在app中创建templatetags模块(必须的)

    2、创建任意 .py 文件,如:my_tags.py

        该文件前端有固定格式    

    from django import template
    from django.utils.safestring import mark_safe
    
    register = template.Library() 
    @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)

    3、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py :{% load my_tags %}

    4、使用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 %}

    5、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.

    特别注意:filter可以用在if等语句后,simple_tag不可以  

    {% if num|filter_multi:30 > 100 %}
        {{ num|filter_multi:30 }}
    {% endif %}

    以上为今日内容,复习完毕。切记在settings中的INSTALLED_APPS配置当前app

  • 相关阅读:
    LeetCode OJ 107. Binary Tree Level Order Traversal II
    LeetCode OJ 116. Populating Next Right Pointers in Each Node
    LeetCode OJ 108. Convert Sorted Array to Binary Search Tree
    LeetCode OJ 105. Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode OJ 98. Validate Binary Search Tree
    老程序员解Bug的通用套路
    转载 四年努力,梦归阿里,和大家聊聊成长感悟
    转载面试感悟----一名3年工作经验的程序员应该具备的技能
    Web Service和Servlet的区别
    关于spring xml文件中的xmlns,xsi:schemaLocation
  • 原文地址:https://www.cnblogs.com/xiaoyaotx/p/13258325.html
Copyright © 2011-2022 走看看