• Template 模板


    MVC   MTV

    MVC

    • M models(和数据库进行交互)

    • V view(视图 展示数据 html文件)

    • C controller(控制器 调度)

    MTV

    • M models(orm)

    • T template(模板 渲染 html文件)

    • V view(视图 函数,业务逻辑)

    变量

    在模板中使用变量,通常使用 . 的形式进行调用

    {{ 列表.0 }}       索引
    
    {{ 字典.'' }}
    
    {{ 字典.keys }}
    
    {{ 字典.values}}
    
    {{ 字典.items}}
    
    {{ 对象.属性}}
    
    {{ 对象.方法}}       只能调用没有参数的方法

    优先级:

    1.字典的key

    2.属性或者方法

    3.数字索引

    filter  过滤器

    官方文档 : https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#ref-templates-builtins-filters

    default 默认值

    {{ value|default:"nothing"}}   变量不存在或者值为空时,显示默认值

    filesizeformat 文件尺寸

    (例如 '13 KB', '4.1 MB', '102 bytes', 等等)

    {{ value|filesizeformat }}

    add 加

    数字加减(负数)

    字符串拼接

    列表拼接

    {{ value|add:"2" }}

    首先尝试将两个值强制转换为整数,如果失败,它将尝试将值一起添加到一起。这将适用于某些数据类型(字符串,列表等),而对其他数据类型则失败。如果失

    败,结果将为空字符串。可以强制转换为整数的字符串将被求和

    lower 小写

    {{ value|lower }}

    upper 大写

    {{ value|upper}}

    title 标题

    首字母大写

    {{ value|title }}

    ljust 左对齐

    {{ value|ljust:"10" }}

    rjust 右对齐

    {{ value|rjust:"10" }}

    center 居中

    页面显示时会将空格折叠,所以在显示时可能看不到居中的效果

    {{ value|center:"15" }}

    length 长度

    {{ value|length }}

    返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.

    slice 切片  

    {{value|slice:"2:-1"}}

    first

    取第一个元素

    {{ value|first }}

    last

    取最后一个元素

    {{ value|last }}

    join 拼接

    同python的str.join(list)

    {{ value|join:" // " }}

    truncatechars 截断

    如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。需要注意的是,省略号也会被计算进截断的字符数中

    {{ value|truncatechars:9}}     参数:截断的字符数

    date 日期格式化

    {{ value|date:"Y-m-d H:i:s"}}      html中的格式与python中不同

    可格式化输出的字符:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#date

    safe 安全

    Django会出于安全,对HTML标签和JS等语法标签进行自动转义,显示字符串形式。但是有的时候我们可能不希望这些HTML元素被转义,可以通过过滤器“|safe”的

    方式告诉Django这段代码是安全的不必转义。

    value = '<a href = "www.baidu.com"></a>'
    
    {{ value|safe}}

     自定义filter

    1.在app下创建一个名为templatetags的包 # templatetags为固定写法,不能变

    2.在包内创建py文件 (例:my_tags.py)

    3.在py文件中:

    from django import template
    
    register = template.Library()     #  register固定写法 不能变

     4.写函数+装饰器

    @register.filter
    def add_str(value, arg=None):        # 函数名就是过滤器的名字  value是变量  arg是给变量添加额外的参数,可以不写
        ret = '{}__{} '.format(value, arg)
        print(ret)
        return ret

     5.在模板中使用自定义过滤器

    {% load my_tags %}             # 导入文件
    
    {{ 'alex'|add_str:'sb' }}

    标签 

     for循环

    {%  for  i in  name_list %}
        {{ forloop }}         
    {% empty %}          # 当没有数据时    
        没有数据
    {% endfor %}

    forloop

    forloop.counter           当前循环的索引值(从1开始)
    forloop.counter0          当前循环的索引值(从0开始)
    forloop.revcounter        当前循环的倒序索引值(到1结束)
    forloop.revcounter        当前循环的倒序索引值(到0结束)
    forloop.first             判断当前循环是不是第一次循环
    forloop.last              判断当前循环是不是最后一次循环
    forloop.parentloop        本次循环的外层循环

    if判断

    {% if user_list %}
      用户人数:{{ user_list|length }}
    {% elif black_list %}
      黑名单数:{{ black_list|length }}
    {% else %}
      没有用户
    {% endif %}

    if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断

    不支持算数运算,但是可以使用add等内置过滤器等方法实现

    不支持连续判断,和python不同 例: 10 > 5 > 1 结果为false

    with

    定义一个中间变量

    {% with total=business.employees.count %}       将数据赋值给中间变量total
        {{ total }} employee{{ total|pluralize }}   直接使用total写逻辑
    {% endwith %}

    母版和继承

    母版:

    将多个页面共同的html代码提取出来,生成一个新的html文件

    可以在文件中定义一些block块,让子页面重新覆盖     {% block 名称 %} {% endblock %}

    继承:

    在写具体的模板时,继承母版中的代码 {% extends 'html文件名称' %}

    重写block块

    {% block 名称 %}

      '内容'

    {% endblock %}

    注意:

    1. {% extends 'html文件名称' %} 写在最开始,前面不要有内容

    2. {% extends 'html文件名称' %} 文件名字要带引号,不然会被当做变量名称去查找

    3. 要在页面显示的内容放在block块中,写在其他部分不会显示

    4. 如果模板中定义了多个block块 一般写css js

    组件

    把文件中共同的一段代码封装在一个html文件中(代码固定写死,不灵活)

    使用: {% include ‘文件名称’ %}

    静态文件

    如果在项目开发过程中,修改了settings文件中静态文件的别名,需要把所有文件当中的引用全部修改,可以使用相关的方法,动态获取静态文件的别名.

    {% load static %}         获取静态文件名称,在括号内补全路径
    
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.3.7/css/bootstrap.css' %}"
    
    {% get_static_prefix %}    获取静态文件的别名   在括号外补全路径
    
    <link rel="stylesheet" href="{% get_static_prefix %}plugins/bootstrap-3.3.7/css/bootstrap.css">

    自定义simple_tag

    自定义filter最多只能有两个参数,变量和参数,有一定局限

    自定义simple_tag和自定义filter类似,但是接收更灵活的参数

    流程与自定义filter大致一样

    写函数+装饰器

    @register.simple_tag
    def join_str(*args,**kwargs):          接收的参数无限制,使用万能形参
        return '+'.join(args), '*'.join(kwargs.values())

    在模板中使用

    {% load my_tags %}
    
    {% join_str 'alex' 'wusir' k1='taibai' k2='baoge' %}    各参数以空格分隔

    自定义inclusion_tag

    返回html代码片段

    例:分页功能

    写函数+装饰器

    @register.inclusion_tag('pagination.html')           # 需要写返回的html文件名字
    
    def pagination(num,now):
        return {'num':range(1,num+1),'now':now}          # 以字典形式返回 num是数字数字不可迭代,返回值时需要处理一下

    写pagination.html文件

    <nav aria-label="Page navigation">
        <ul class="pagination">
            <li>
                <a href="#" aria-label="Previous">
                    <span aria-hidden="true">&laquo;</span>
                </a>
            </li>
            {% for i in num %}                   
                {% if i == now %}           {# 将当前页面设置成选中状态 #}
                    <li class="active" ><a href="#">{{ i }}</a></li>
                {% else %}
                    <li><a href="#">{{ i }}</a></li>
                {% endif %}
            {% endfor %}
            <li>
                <a href="#" aria-label="Next">
                    <span aria-hidden="true">&raquo;</span>
                </a>
            </li>
        </ul>
    </nav>

    在模板中使用

    {% load my_tags %}
    
    {% pagination 5 3 %}
  • 相关阅读:
    str.format格式化用法(通过{}来替代%)
    urlparse模块(专门用来解析URL格式)
    Socket原理与编程基础
    如何查询端口号和网址的ip地址?
    urlretrieve 如何给文件下载设置下载进度?
    判断URL是否支持断点续传?
    断点续传
    HTTP协议详解之User Agent篇
    HTTP协议详解之基本认证篇
    HTTP协议详解之请求篇
  • 原文地址:https://www.cnblogs.com/sandy-123/p/10657154.html
Copyright © 2020-2023  润新知