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 %}

猜你喜欢

转载自www.cnblogs.com/sandy-123/p/10657154.html