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

  • 相关阅读:
    Java static keyword
    Final Keyword In Java
    Underscore template
    Query.extend() 函数详解-转载
    js闭包for循环总是只执行最后一个值得解决方法
    mui scroll和上拉加载/下拉刷新
    mui 手势事件配置
    118. 杨辉三角
    [ 周赛总结 ] 第 185 场力扣周赛
    55. 跳跃游戏
  • 原文地址:https://www.cnblogs.com/xiaoyaotx/p/13258325.html
Copyright © 2011-2022 走看看