zoukankan      html  css  js  c++  java
  • Django中级篇之模板语言

    模板

    一、引用变量

    模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户。

    {{ xxx }}
    

    二、标签

    用{%  %}表示,用于处理一些逻辑

    常用的几个标签
    
    {% if 条件 %}
        内容
    {% endif %}
    
    {% for  xxx  in  条件 %}
        {{xxx}}
    {% endfor %}    
    

    1、for标签

    1>每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容

    2> 给标签增加一个 reversed 使得该列表被反向迭代

    {% for athlete in athlete_list reversed %}
    

    3>可以嵌套使用 {% for %} 标签

    4> Django不支持退出循环操作。 如果我们想退出循环,可以改变正在迭代的变量,让其仅仅包含需要迭代的项目。 同理,Django也不支持continue语句,我们无法让当前迭代操作跳回到循环头部。

    5>在每个`` {% for %}``循环里有一个称为`` forloop`` 的模板变量。这个变量有一些提示循环进度信息的属性。

    富有魔力的forloop变量只能在循环中得到,当模板解析器到达{% endfor %}时forloop就消失了

    forloop.counter 总是一个表示当前循环的执行次数的整数计数器
    
    forloop.counter0 类似于forloop.counter ,但是它是从0计数的
    
    forloop.first是一个布尔值;在第一次执行循环时被置为True
    
    forloop.last 是一个布尔值;在最后一次执行循环时被置为True

    2、if标签

    1>{% if %}标签计算一个变量值,如果是“true”,即它存在、不为空并且不是false的boolean值 系统则会显示{% if %}和{% endif %}间的所有内容

    2>没有{% elif %}标签,使用嵌套的{% if %}标签可以做到同样的事情

    3>{% if %}标签接受and,or或者not来测试多个变量值或者否定一个给定的变量

    4>{% if %}标签不允许同一标签里同时出现and和or,否则逻辑容易产生歧义

    5>如果你想结合and和or来做高级逻辑,只需使用嵌套的{% if %}标签即可

    6>多次使用同一个逻辑符号是合法的

    三、模板继承

    模板可以用继承的方式来实现复用。在整个网站中,减少共用页面区域(比如站点导航)所引起的重复和冗余代码

    本质上来说,模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载,第一步是定义 基础模板 , 该框架之后将由子模板所继承

    母版:

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>{% block title %}久久寻网{% endblock %}</title>
    <link type="text/css" rel="stylesheet" href="style.css" />
    </head>
    <body>
        <div id="side">
            {% block side %}
            <ul>
                <li><a href="/index.html">主页</a></li>
                <li><a href="/blog/index.html">博客</a></li>
            </ul>
            {% endblock %}
        </div>
        <div id="content">
            {% block content %}{% endblock %}
        </div>
    </body>
    </html>
    

    我们称它为 base.html, 定义了一些简单的 HTML 骨架文档, 你可以把它用到一些简单两列的网页上. “子” 模板的任务就是用内容填写这些空白的内容块

    子版:

    {% extends "text.html" %}
    {% block title %}修改标题{% endblock %}
    
    {% block side %}
        <ul>
            <li><a href="/index.html">修改后主页</a></li>
            <li><a href="/blog/index.html">修改后博客</a></li>
        </ul>
    {% endblock %}
    
    {% block content %}
        
    <h1>新增加内容</h1>
        
    {% endblock %}
    

    1>{% extends "text.html" %}表示导入母版

    2> 每个{% block %}标签所要做的是告诉模板引擎,该模板下的这一块内容将有可能被子模板覆盖,而不一定一定要覆盖掉母版中的内容

    四、注释标签

    1. Django单行注释使用 {# 这是一个注释 #}

    用这种语法的注释不能跨越多行, 这个限制是为了提高模板解析的性能。 在下面这个模板中,输出结果和模板本身是 完全一样的(也就是说,注释标签并没有被解析为注释):

    This is a {# this is not
    a comment #}
    test.
    

    2. 实现多行注释,可以使用`` {% comment %}`` 模板标签

    {% comment %}
    This is a
    multi-line comment.
    {% endcomment %}
    

    五、过滤器

    1>模板过滤器可以在变量被显示前修改它,过滤器使用管道字符,如下所示:

    {{ name|lower }}
    

    2>过滤管道可以被* 套接* ,既是说,一个过滤器管道的输出又可以作为下一个管道的输入:

    {{ my_list|first|upper }}
    

    六、ifequal/ifnotequal 标签

    1. {% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值下面的例子比较两个模板变量 user 和 currentuser :

    {% ifequal user currentuser %}
        <h1>Welcome!</h1>
    {% endifequal %}

    自定义simple_tag

    a、在app中创建templatetags模块

    b、创建任意 .py 文件,如:xx.py

     View Code

    c、在使用自定义simple_tag的html文件中导入之前创建的 xx.py 文件名

    {% load xx %}

    d、使用simple_tag

    {% my_simple_time 1 2 3%}
    
    {% my_input 'id_username' 'hide'%}
    

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

     View Code
  • 相关阅读:
    #35 string(缩点+动态规划)
    BZOJ2744 HEOI2012朋友圈(二分图匹配)
    BZOJ2749 HAOI2012外星人(数论)
    BZOJ2743 HEOI2012采花(离线+树状数组)
    洛谷 P3539 [POI2012]ROZ-Fibonacci Representation 解题报告
    关于图论的一些问题模型
    洛谷 P2505 [HAOI2012]道路 解题报告
    ST表
    洛谷 P4754 True Vegetable 解题报告
    洛谷 P2053 [SCOI2007]修车 解题报告
  • 原文地址:https://www.cnblogs.com/yezuhui/p/6853419.html
Copyright © 2011-2022 走看看