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 %}
注意:
-
{% extends 'html文件名称' %} 写在最开始,前面不要有内容
-
{% extends 'html文件名称' %} 文件名字要带引号,不然会被当做变量名称去查找
-
要在页面显示的内容放在block块中,写在其他部分不会显示
-
如果模板中定义了多个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">«</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">»</span> </a> </li> </ul> </nav>
在模板中使用
{% load my_tags %} {% pagination 5 3 %}