zoukankan      html  css  js  c++  java
  • Django(三):模板语言

    • 一、提要
    • 二、Filters
    • 三、Tags
    • 四、母版和继承
    • 五、组件的使用和注意事项
    • 六、静态路径的写法
     
     
    一、提要:

     
    1.官方文档:
     
    2.引入三种特殊符号:
    变量相关的用 {{ }} ,逻辑相关的用 {% %} , .)在模板语言中有特殊的含义,用来获取对象的相应属性值
     
    3.模板中支持的写法:
    {# 取list中的第一个参数 #}
    {{ list.0 }}
    {# 取字典中key的值 #}
    {{ d.name }}
    {# 取对象的name属性 #}
    {{ person_list.0.name }}
     
     
    二、Filters

    语法: {{ value|filter_name:参数 }}
     
    1.defalut:
    {{ value|default: "nothing"}}
    如果value值没传的话就显示nothing
     
    2.length:
    {{ value|length }}
    返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.
     
    3.filesizeformat:
    {{ value|filesizeformat }}
    将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。如果 value 是 123456789,输出将会是 117.7 MB。
     
    4.slice
    {{value|slice:"2:-1"}}
    切片
     
    5.data:
    {{ value|date:"Y-m-d H:i:s"}}
    格式化
     
    6.safe:
    Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。
    下面只会显示点我
    value = "<a href='#'>点我</a>"
    {{ value|safe}}
     
    7.truncatechars:
    {{ value|truncatechars:9}}
    参数:截断的字符数
    如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
     
    8.自定义filter:
    a.自定义filter代码文件摆放位置:
    app01/
        __init__.py
        models.py
        templatetags/  # 在app01下面新建一个templatetags文件
            __init__.py   如果没有这个就手动创建
            app01_filters.py  # 建一个存放自定义filter的文件,名字随意
        views.py
    b.编写自定义filter
    from django import template
    #生成一个注册用的实例
    register = template.Library()
     
    定义并注册一个自定义的filter函数
    @register.filter(name="cut")
    def cut(value, arg):
        return value.replace(arg, "")
     
     
    @register.filter(name="addSB")
    def add_sb(value):
        return "{} SB".format(value)
    c.使用自定义filter
    {# 先导入我们自定义filter那个文件 #}
    {% load app01_filters %}
     
    {# 使用我们自定义的filter #}
    {{ somevariable|cut:"0" }}
    {{ d.name|addSB }}
     
     
    三、Tags

     
    1.for:
    <ul>
    {% for user in user_list %}
        <li>{{ user.name }}</li>
    {% endfor %}
    </ul>
     
    2.for循环可用的一些参数:
    Variable
    Description
    forloop.counter
    当前循环的索引值(从1开始)
    forloop.counter0
    当前循环的索引值(从0开始)
    forloop.revcounter
    当前循环的倒序索引值(从1开始)
    forloop.revcounter0
    当前循环的倒序索引值(从0开始)
    forloop.first
    当前循环是不是第一次循环(布尔值)
    forloop.last
    当前循环是不是最后一次循环(布尔值)
    forloop.parentloop
    本层循环的外层循环
    另外,for循环也可以写入到class中,如:
    <ul>
        {% for name in name_list %}
            <li class='{% if forloop.first %}'sb'{% endif %}'>{{ forloop.revcounter }}-{{ name }}</li>
        {% endfor %}
    </ul>
    #这段代码会把第一个的属性变成sb
     
    3.for...empty:
    <ul>
    {% for user in user_list %}
        <li>{{ user.name }}</li>
    {% empty %}
        <li>空空如也</li>
    {% endfor %}
    </ul>
     
    4.if..elif和else:
    {% if user_list %}
      用户人数:{{ user_list|length }}
    {% elif black_list %}
      黑名单数:{{ black_list|length }}
    {% else %}
      没有用户
    {% endif %}
    {% if user_list|length > 5 %}
      七座豪华SUV
    {% else %}
        黄包车
    {% endif %}
     
    5.with:
    {% with total=business.employees.count %}
        {{ total }} employee{{ total|pluralize }}
        #在这里可以用total
    {% endwith %}
    #定义一个中间变量,
     
     
    四、母版和继承

     
    1.首先写母版:
    # base.html
    <!DOCTYPE html>
    <html>
    <head>
        <title>母版</title>
    </head>
    <body>
    <div>
        <p>母版内容</p>
        <p>图书管理系统</p>
    </div>
     
    <div>
        {% block page-main %}
            #这里是要替换的地方
            #其余的方法都会被继承
        {% endblock %}
    </div>
    </body>
    </html>
     
    2.然后是要继承母版的子页面:
    # insert1.html
    #继承的母版
    {% extends 'base.html' %}
     
    {% block page-main %}
        <h3>我是书籍页页面的自定义内容1,用来替换母版中指定的位置</h3>
        #这里的内容会被替换到母版中
    {% endblock %}
     
     
    3.关于母版中几个列表的切换问题的解决方法:
    <li {% if publisher_list %} class='active' {% endif %}><a href="/publisher_list/">出版社列表</a></li>
    <li {% if all_book %} class='active' {% endif %}><a href="/book_list/">书籍列表</a></li>
    <li {% if author_list %} class='active' {% endif %}><a href="/author_list/">作者列表</a></li>
    或者:
    <li class="{% block publisehr_class %}{% endblock %}"><a href="/publisher_list/">出版社列表</a></li>
    <li class="{% block book_class %}{% endblock %}"><a href="/book_list/">书籍列表</a></li>
    <li class="{% block author_class %}{% endblock %}"><a href="/author_list/">作者列表</a></li>
     
     
     
    五、组件的使用和注意事项

    1.将使用次数多的组件提取出来,保存到xiaohei.html文件中;
    2.在需要添加组件的地方,写入这个:
    {% include 'xiaohei.html' %}
     
     
    六、关于静态文件路径的写法

    {% load static %}
    <img src="{% static "images/hi.jpg" %}"/>
    1.会去settings.py里面查找静态文件夹的别名,帮你拼接具体的静态文件的路径
     
    2.某个文件多处被用到可以存为一个变量
    {% load static %}
    {% static "images/hi.jpg" as myphoto %}
    <img src="{{ myphoto }}"></img>
     
    3.使用get_static_prefix自己拼接路径:
    {% load static %}
    <img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />
    或者:
    {% load static %}
    {% get_static_prefix as STATIC_PREFIX %}
     
    <img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" /><img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />
     
    4.自定义simpletag:
    a.自定义filter代码文件摆放位置:
    app01/
        __init__.py
        models.py
        templatetags/  # 在app01下面新建一个package package
            __init__.py
            mysimpletag.py  # 建一个存放自定义simpletag的文件,名字随意
        views.py
    b.编写自定义simpletag
    from django import template
    #生成一个注册用的实例
    register = template.Library()
     
    @register.simple_tag(name='yimi')
    def my_sum(arg1, arg2, arg3):
        return '{} {} {}'.format(arg1, arg2, arg3)
    c.使用自定义simpletag
    {# 先导入我们自定义filter那个文件 #}
    {% load mysimpletag%}
     
    {# 使用我们自定义的simpletag #}
    {% yimi 'wangzhen' 'changjiang' '12314' %}
    #传入三个参数
     
    5.inclusion_tag:
    多用于返回html代码片段
    实例:templatetags/my_inclusion.py
    from django import template
     
    register = template.Library()
     
     
    @register.inclusion_tag('result.html')
    def show_results(n):
        n = 1 if n < 1 else int(n)
        data = ["第{}项".format(i) for i in range(1, n+1)]
        return {"data": data}
    templates/snippets/result.html
    <ul>
      {% for choice in data %}
        <li>{{ choice }}</li>
      {% endfor %}
    </ul>
    templates/index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="x-ua-compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <title>inclusion_tag test</title>
    </head>
    <body>
     
    {% load inclusion_tag_test %}
     
    {% show_results 10 %}
    </body>
    </html>
     
     
  • 相关阅读:
    wex5 实战 框架拓展之2 事件派发与data刷新
    wex5 实战 框架拓展之1 公共data组件(Data)
    wex5 实战 HeidiSQL 导入Excel数据
    wex5 实战 手指触屏插件 hammer的集成与优劣
    wex5 实战 登陆帐号更换与用户id一致性
    wex5 实战 用户点评与提交设计技巧
    wex5 实战 省市县三级联动与地址薄同步
    wex5 实战 wex5与js的组件关系与执行顺序(父子与先后)
    wex5 实战 单页模式下的多页面数据同步
    [BZOJ]4237: 稻草人
  • 原文地址:https://www.cnblogs.com/changwoo/p/9568483.html
Copyright © 2011-2022 走看看