zoukankan      html  css  js  c++  java
  • 4 模板层

    一、模板语法の重点

    1 变量:{{ 变量名 }}
            深度查询时用句点符
            过滤器
    2 标签:{{%  %}}

    二、模板语法の变量

    {{ VariableName }}
    
    {{ VariableName.属性 }}
    可用 . 符号进行进一步的深度查询,既可以对列表进行更进一步的查询取值,也可以对字典进行取值。
    
    {{ VariableName.func }}
    在执行对象方法时,不用加()即可执行,这是在 Django 对语法的规定。
    
    {#    #}
    正常情况下,在 HTML 页面中的注释,是可以查看到的。但是模板中的注释在前端页面是看不到的。(通过进入开发者模式查看)
    
    空列表渲染后的结果是 [] ,空字符串渲染后是没有显示的内容的。
    
    XSS:跨站脚本攻击。比如在一个可以提交数据的 HMTL 页面中写入一组或者多组标签
    "<script>alert('hi')</script>",则在下次打开此页面时会出现弹窗。

    {{ dict.name.upper }}
    字符串的方法是不用加()的,而且没有参数 了解: locals() 可将函数中的所有数据全部传入页面中进行渲染,但是在开发中不建议使用。

    三、模板の过滤器

    1 常见的过滤器

    date:{{ now|date:'Y-m-d H:m:s' }}  在前端页面格式化输出时间
    可将date 看成函数,now 是第一个参数,: 后面是第二个参数
    
    default:{{ ""|default:"value" }}  给空字符串设置一个默认值
    
    length:{{ "string"|length }}   计算 string 字符串的长度
    
    filesizeformat:{{ file|filesizeformat }}  将文件的大小格式化之后显示在前端页面
    
    slice:{{ value|slice:'2:4' }}   将 value 值进行切片,顾头不顾尾   
    
    truncatechars:{{ value|truncatechars:6 }}  加上3个省略号总共显示6个字符
    
    truncatewords:{{ words|truncatewords:3 }}  将 words 截断出3个,不包括省略号

    safe:{{ tags_string|safe }} 将字符串标签渲染成 HTML 正常标签

    add:{{ value1|add:value2 }} value1+value2

    2 其它过滤器(了解)

    过滤器 描述 示例
    upper 以大写方式输出 {{ user.name | upper }}
    add 给value加上一个数值 {{ user.age | add:”5” }}
    addslashes 单引号加上转义号  
    capfirst 第一个字母大写 {{ ‘good’| capfirst }} 返回”Good”
    center 输出指定长度的字符串,把变量居中 {{ “abcd”| center:”50” }}
    cut 删除指定字符串 {{ “You are not a Englishman” | cut:”not” }}
    date 格式化日期  
    default 如果值不存在,则使用默认值代替 {{ value | default:”(N/A)” }}
    default_if_none 如果值为None, 则使用默认值代替  
    dictsort 按某字段排序,变量必须是一个dictionary {% for moment in moments | dictsort:”id” %}
    dictsortreversed 按某字段倒序排序,变量必须是dictionary  
    divisibleby 判断是否可以被数字整除
    {{ 224 | divisibleby:2 }}  返回 True
    escape 按HTML转义,比如将”<”转换为”&lt”  
    filesizeformat 增加数字的可读性,转换结果为13KB,89MB,3Bytes等
    {{ 1024 | filesizeformat }} 返回 1.0KB
    first 返回列表的第1个元素,变量必须是一个列表  
    floatformat 转换为指定精度的小数,默认保留1位小数 {{ 3.1415926 | floatformat:3 }} 返回 3.142  四舍五入
    get_digit 从个位数开始截取指定位置的数字 {{ 123456 | get_digit:’1’}}
    join 用指定分隔符连接列表 {{ [‘abc’,’45’] | join:’*’ }} 返回 abc*45
    length 返回列表中元素的个数或字符串长度  
    length_is 检查列表,字符串长度是否符合指定的值 {{ ‘hello’| length_is:’3’ }}
    linebreaks 用<p>或<br>标签包裹变量 {{ “Hi David”|linebreaks }} 返回<p>Hi</p><p>David</p>
    linebreaksbr 用<br/>标签代替换行符  
    linenumbers 为变量中的每一行加上行号  
    ljust 输出指定长度的字符串,变量左对齐 {{‘ab’|ljust:5}}返回 ‘ab   ’
    lower 字符串变小写  
    make_list 将字符串转换为列表  
    pluralize 根据数字确定是否输出英文复数符号  
    random 返回列表的随机一项  
    removetags 删除字符串中指定的HTML标记 {{value | removetags: “h1 h2”}}
    rjust 输出指定长度的字符串,变量右对齐  
    slice 切片操作, 返回列表 {{[3,9,1] | slice:’:2’}} 返回 [3,9]
    {{ 'asdikfjhihgie' | slice:':5' }} 返回 ‘asdik’
    slugify 在字符串中留下减号和下划线,其它符号删除,空格用减号替换
    {{ '5-2=3and5 2=3' | slugify }} 返回 5-23and5-23
    stringformat 字符串格式化,语法同python  
    time 返回日期的时间部分  
    timesince 以“到现在为止过了多长时间”显示时间变量 结果可能为 45days, 3 hours
    timeuntil 以“从现在开始到时间变量”还有多长时间显示时间变量  
    title 每个单词首字母大写  
    truncatewords 将字符串转换为省略表达方式
    {{ 'This is a pen' | truncatewords:2 }}返回
    This is ...
    truncatewords_html 同上,但保留其中的HTML标签
    {{ '<p>This is a pen</p>' | truncatewords:2 }}返回
    <p>This is ...</p>
    urlencode 将字符串中的特殊字符转换为url兼容表达方式 {{ ‘http://www.aaa.com/foo?a=b&b=c’ | urlencode}}
    urlize 将变量字符串中的url由纯文本变为链接  
    wordcount 返回变量字符串中的单词数  
    yesno 将布尔变量转换为字符串yes, no 或maybe
    {{ True | yesno }}
    {{ False | yesno }}
    {{ None | yesno }}
    返回 
    yes
    no 
    maybe

    3 自定义过滤器

    1 在 settings 中查看 app 是否注册
    2 在 app 下写一个名字必须是 templatetags 的文件夹
    3 在templatetags 文件夹下写一个自定义的 py 文件(如:test.py)
        3.1 from django import template
        3.2 register=template.Library()   register 的名字不能改变
        3.3 @register.filter()  括号中可以传 name=rename,也可以不传
        3.4 def addstr(x,y):   可以自定义过滤器名字
                  return x+y
    4 在模板中的使用:
    {% load test %}
    先导入自定义的 py 文件
    
    {{ str1|addstr:str2 }}   
    
    注意:
    自定义的过滤器最多传2个参数;
    {{ str1|addstr:str2 }}可以当成 if 的条件

    四、静态文件的配置另外两种方法(static)

    {{% load static %}}
    先导入static
    
    方式一:
    <link href="{% staitic 'my_css.css' %}">
    这里的 static 指的就是 STATIC_URL 的 static,而 my_css.css 当成参数传给了static
    
    <link href="{% get_static_prefix %}my_css.css">
    get_static_prefix 指的就是 STATIC_URL 的 static,然后手动跟 my_css.css拼接路径

    五、模板语法の标签

    1 for 标签

    {% for foo in list %}
        {{ foo }}
       {{ forloop }}
       {% empty %}  empty 必须在 for 循环中使用,表示的是若list中有值,不执行下一步;若无值,则执行下一步
    {% endfor %}

    2 if 标签

    {% if condition %}
        {{ name }}
    {% endif %}
    
    
    注意:
    if 语句支持逻辑判断:< / = / > / != / in / not in / is / is not

    3 with 重命名标签

    方式一:
    {% with rename=dic.name %}  相当于重新赋值
        {{ dic.name }}
        {{ rename }}
    {% endwith %}
    
    
    方式二:
    {% dic.name as rename%}  
        {{ dic.name }}
        {{ rename }}
    {% endwith %}

    4 自定义标签

    1 在 settings 中查看 app 是否注册
    2 在 app 下写一个名字必须是 templatetags 的文件夹
    3 在templatetags 文件夹下写一个自定义的 py 文件(如:test.py)
        3.1 from django import template
        3.2 register=template.Library()   register 的名字不能改变
        3.3 @register.simple_tag(name='rename')  
        3.4 def my_sum(x,y):   可以自定义过滤器名字
                  code...               可以进行处理
                  return x+y
    4 在模板中的使用:
    {% load test %}
    先导入自定义的 py 文件
    
    {% rename 参数1 参数2%}
    以空格对参数进行分隔
    
    注意:
    自定义的标签可以有很多参数;
     

    5 自定义标签与自定义过滤器最大的区别

    自定义的标签不可做 if 判断的条件;

    自定义的过滤器可以做 if 判断的条件。

    六、模板の导入与继承

    1 模板导入

      模板导入就是将一个 HTML 页面的内容导入另一个 HTML 页面中。一般情况下,都是将页面中共有的部分单独提取出来,放入一个页面中,用的时候直接导入即可。

    (1) 模板导入的语法

    {% include '被模板名字.html' %}

    (2) 访问方法

      将上面的语法写至要打开的 HTML 页面的某一个位置时,只需要访问当前的 HTML 页面,即可在相应位置出现被导入模板的内容。

    2 模板继承

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <link rel="stylesheet" href="style.css"/>
     5     <title>{% block title %}My amazing site{% endblock %}</title>
     6 </head>
     7 
     8 <body>
     9 <div id="sidebar">
    10     {% block sidebar %}
    11         <ul>
    12             <li><a href="/">Home</a></li>
    13             <li><a href="/blog/">Blog</a></li>
    14         </ul>
    15     {% endblock %}
    16 </div>
    17 
    18 <div id="content">
    19     {% block content %}{% endblock %}
    20 </div>
    21 </body>
    22 </html>
    母版
    {% extends "base.html" %}
     
    {% block title %}My amazing blog{% endblock %}
     
    {% block content %}
    {% for entry in blog_entries %}
        <h2>{{ entry.title }}</h2>
        <p>{{ entry.body }}</p>
    {% endfor %}
    {% endblock %}
    子模板

    (1)模板继承的总结:

    1️⃣ {% extends '母版.html'%} 是表示子模板继承了模板的 block 内容,而且 这个必须是写在子模板的第一行。
    
    2️⃣ 写一个模板,假设是 base.html
    
    3️⃣ 在 base.html 中设置一些盒子(即需要更改或者有可能更改的的地方),rename是别名
    {% block rename %}     
        code...
    {% endblock rename %}
    
    4️⃣ 调用:super 表示还需要母版的内容,放在哪里就会显示在哪里(得在 block 之间)
    {% extends 'base.html' %}
    {% block rename %}
        my code...
        {{ block.supper }}    
    {% endblock rename %}
    
    5️⃣ 若不继承盒子,会用原内容;若继承了盒子,但没写自己的内容,就会显示个空白
    
    6️⃣ 盒子在继承时,跟顺序是没有关系的,endblock 后面也可以跟着上面 block 开始写的 rename,避免混淆

    3 自定义 inclusion_tag

    1️⃣ settings 中配置 app
    2️⃣ app 目录下创建 templatetags
    3️⃣ 写一个自定义的 py 文件,my_test.py
    4️⃣ from django import template
         register=template.Library()
         @register.inclusion_tag('test.html')  自定义的 html 文件名
         def my_inclusion(n):
         data=[]
         for i in range(10):
            data.append(i)
            return {'data':data}
    5️⃣ 写 test.html 页面
    <ul>
        {% for choice in dadta %}
        <li>{{ choice }}</li>
        {% endfor %}
    </ul>
    6️⃣ {% load my_test %}
    {% my_inclusion 10 %}
  • 相关阅读:
    sql-定义变量
    sql-逻辑循环while if
    iOS生命周期
    iOS系统架构
    SVN记住密码
    视图在控制权限的作用
    20140524数据库课笔记
    char和varchar区别
    多表查找
    create table约束
  • 原文地址:https://www.cnblogs.com/Smart1san/p/9629746.html
Copyright © 2011-2022 走看看