1. MVC框架和MTV框架
1. MVC框架
MVC: M -- models 数据库相关 V -- views 视图相关(逻辑) C -- controller url控制器(url分发器,路由分发)
2. MTV框架
django -- MTV M -- models 数据库相关 T -- templates HTML相关 html就是模板 V -- views 视图(逻辑业务相关) + controller url控制器(url分发器,路由分发)
2. 语法
模板渲染的官方文档
关于模板渲染你只需要记两种特殊符号(语法):
{{ }}和 {% %}
变量相关的用{{}},逻辑相关的用{%%}。
3. 变量
1. 万能的点调用
{{ 变量名 }}
变量名由字母数字和下划线组成。
点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值。
举例说明
views.py
from django.shortcuts import render import datetime def index(request): name = "水手" num = 100 lst = [1, 2, "aa", "bb"] dic = {"xx": "oo", "xxx": "ooo"} date = datetime.date(1993, 5, 2) # 日期对象 class Person(): n = "黑哥" def p(self): return "床前明月光" obj = Person() return render(request, "index.html", {"name": name, "num": num, "lst": lst, "dic": dic,"date":date, "obj": obj}) # print(locals()) 获得全局字典,传的数据多,效率低 # return render(request, "index.html", locals())
index.html 代码
<h1>24期官网</h1> <h2>{{ name }}</h2> # 获得后端name的值渲染到页面 <h2>{{ num }}</h2> # 获得后端num的值渲染到页面 <h2>{{ lst }}</h2> # 获得后端lst的值渲染到页面 <h2>{{ dic }}</h2> # 获得后端dic的值渲染到页面 <h2>{{ obj }}</h2> # 获得后端obj的对象渲染到页面 <h2>{{ lst.1 }}</h2> # {#点索引获取对应的值#} <h2>{{ dic.xx }}</h2> # {#点键获取字典的值#} <h2>{{ obj.n }}</h2> # {#点属性获取值#} <h2>{{ obj.p }}</h2> # {#点方法获取返回值,前端调用不加括号#} <h2>{{ dic.keys }}</h2> {#先查找字典中的键,有此键就不调用方法了#} <h2>{{ dic.items }}</h2> # {#点方法获取字典的键值对#} # {# dic.values获取值,dic.keys获取键 #}
2. 查询顺序
字典查询(Dictionary lookup)
属性或方法查询(Attribute or method lookup)
数字索引查询(Numeric index lookup)
举例说明
dic = {"xx": "oo", "xxx": "ooo","keys":"我在执行我"} <h2>{{ dic.items }}</h2> # 前端执行时先在字典中查询此键,有键就不执行字典的方法了 # 结果是: 我在执行我 而不是: dict_keys(['xx', 'xxx']) 键的列表
3. 注意点
- 调用方法不支持传参数。
- 如果使用的变量不存在, 模版系统将插入 string_if_invalid 选项的值, 它被默认设置为'' (空字符串)
4. 过滤器 filter
1. 语法
{{ value|filter_name }}
{{ value|filter_name:参数 }}
2. 具体举例
1. default 默认
注意:':'左右没有空格没有空格没有空格,nothing需要引号引起来
<h2>{{ age|default:"Nothing" }}</h2> # 变量不存在,显示为空字符串,设置默认值 返回同样是nothing的还有有这个变量,但是值是False,空字典等值为空的
注:TEMPLATES的OPTIONS可以增加一个选项:string_if_invalid:'找不到',可以替代default的的作用
见上述做修改部分替代default的作用 在settings文件中TEMPLATES的'OPTIONS'字典中再添加一个键值对 "string_if_invalid":"不存在或为空" 为空时或不存在时执行
2. filesizeformat
将值格式化为一个 “人类可读的” 文件格式大小 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)
{{ value|filesizeformat }} #如果 value 是 123456789,输出将会是 117.7 MB
3. add 添加
<h2>{{ num|add:22 }}</h2> # html语法加不加引号效果相同 <h2>{{ num|add:"22" }}</h2> # html语法加不加引号效果相同 num=100 结果:122 <h2>{{ lst|add:lst }}</h2> # <h2>{{ name|add:"bsb" }}</h2> # 也可以用于字符串和列表等的相加
4. length 长度
<h2>{{ name|length }}</h2> # 字符长度 <h2>{{ lst|length }}</h2> # 列表长度 <h2>{{ dic|length }}</h2> # 字典长度 <h2>{{ name|add:"bsb"|length }}</h2> # 多重操作
5. slice 切片
<h2>{{ name|add:"abcdefg"|slice:"2:-1:2" }}</h2> # ace 支持切片和步长
6. first 取第一个值
<h2>{{ name|first }}</h2> # 获取第一个值 <h2>{{ value|last }}</h2> # 获取最后一个值
7. join 拼接
<h2>{{ name|join:"//" }}</h2> # 结果 水//手 相当于字符串拼接 <h2>{{ dic|join:"//" }}</h2> # 键拼接 xx//xxx <h2>{{ lst|join:"//" }}</h2> # 迭代拼接 1//2//aa//bb
8. truncatechars
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾
<h2>{{ "abcdefghigk"|truncatechars:3 }}</h2> # ... 保留几个字符,小于三也是三个点 <h2>{{ "abcdefghigk"|truncatechars:6 }}</h2> # abc... 保留6个,有三个点
9. date日期格式化
date = datetime.date(1993, 5, 2) # 日期对象 now = datetime.datetime.now() # 现在时间 <h2>{{ date|date:"Y-m-d"}}</h2> # <h2>{{ now|date:"Y-m-d H:i:s"}}</h2> # 设置显示格式
扩展,不过滤,在设置settings中修改
# USE_L10N = True USE_L10N = False DATETIME_FORMAT = "Y-m-d H:i:s" DATE_FORMAT = "Y-m-d" TIME_FORMAT = "H:i:s" <h2>{{ date }}</h2> # <h2>{{ now }}</h2> # 设置显示格式
10. safe
bd = '<a href="http://www.baidu.com">百度</a>' # 后端 前端: <h2>{{ bd }}</h2> # 显示字符串 <a href="http://www.baidu.com">百度</a> <h2>{{ bd|safe }}</h2> # 设置safe,显示为a标签 百度
11. truncatewords
msg = "我 是 i love you my baby" <h3>{{ msg|truncatewords:2 }}</h3> # {# 以空格区分截断,不是字符字节 #} 我 是 ... <h3>{{ msg|truncatechars:2 }}</h3> # 注意二者的区分 ...
5. 自定义过滤器
1. 自定义过滤器
1.在app下创建一个名叫templatetags的包 (templatetags名字不能改)
2.在包内创建py文件 (文件名可自定义 my_tags.py)
3.在my_tags.py中写代码:
from django import template register = template.Library() # register名字不能错,固定
4. 写上一个函数 + 加装饰器
@register.filter def xx(v1,v2): ret = v1+v2 return ret.upper()
5. 使用
index.html 中
{% load my_tags %} # 加载py文件 {{ "alex"|xx:"dsb" }} # alex和dsb 分别对应两个参数,渲染返回值 # 参数至多两个,至少一个 name = "alex"可以通过index函数传递
6. 其他写法
from django import template register = template.Library() @register.filter def xx(v1,v2="dsb"): ret = v1 + v2 return ret.upper() {% load my_tags %} {{ "alex"|xx }} # 后端添加默认参数 ALEXDSB
只有一个参数
from django import template register = template.Library() @register.filter def xx(v1): ret = v1 return ret.upper() {% load my_tags %} {{ "alex"|xx }} # 后端添加默认参数 ALEX
给函数起一个别名
from django import template register = template.Library() @register.filter(name="xxsb") def xx(v1,v2): ret = v1 + v2 return ret.upper() {% load my_tags %} {{ "alex"|xxsb:"dsb" }} # 注意用别名 ALEXDSB
1. 自定义标签和过滤器
1 在应用app01下创建一个叫做templatetags的包(名称不能改),在里面创建一个py文件,例如xxoo.py 2 在xxoo.py文件中引用django提供的template类,写法 from django import template #register名称不可变,library大写 register = template.Library() #定义过滤器 @register.filter # 参数至多两个 def xx(v1,v2): return v1+v2 使用: {% load xxoo %} # 加载上文件名xxoo,相当于引入xxoo.py文件 {{ name|xx:'oo' }} # xx是函数名 传两个参数 # 自定义标签 没有参数个数限制 @register.simple_tag def huxtag(n1,n2): #冯强xx '牛欢喜' ''' :param n1: 变量的值 管道前面的 :param n2: 传的参数 管道后面的,如果不需要传参,就不要添加这个参数 :return: ''' return n1+n2 # inclusion_tag 返回html片段的标签 @register.inclusion_tag('result.html') def res(n1): #n1 : ['aa','bb','cc'] return {'li':n1 } 使用: {% res a %}
1. 自定义标签和过滤器大前提
1 在应用下创建一个叫做templatetags的文件夹(名称不能改),在里面创建一个py文件,例如xxxx.py 2 在xx.py文件中引用django提供的template类,写法 from django import template #register名称不可变,library大写 register = template.Library()
2. 定义过滤器
1. 页面请求 127.0.0.1/new/ 2. 找到 url(r'^test/', views.test) 执行 new函数 3. new有第三个参数,{"name":"Alex"}传到new.html文件中 4. {{ name|addoo:"dsb"}}加载xx.py文件,调用xx中的addoo函数 5. 执行xx中的res函数 return n1+n2,参数一一对应 6.替换new.html中内容,响应浏览器,显示结果
3. 自定义标签
1. 页面请求 127.0.0.1/new/ 2. 找到 url(r'^new/', views.new) 执行 new函数 3. new有第三个参数,{"name":"Alex"}传到new.html文件中 4. {% load xx %}加载xx.py文件,调用{% res name "dsb" %}函数 5. 执行xx中的res函数 return n1+n2,参数一一对应 6.替换new.html中内容,响应浏览器,显示结果
4. inclusion_tag 返回html片段的标签
1. 页面请求 127.0.0.1/new/ 2. 找到 url(r'^new/', views.new) 执行 new函数 3. new有第三个参数,{"a":a}传到new.html文件中 4. {% load xx %}加载xx.py文件,调用{% res a "s2" %}函数 5. 执行xx中的res函数 6. 将return值返回给@register.inclusion_tag("result.html")的result.html 7. 修饰后依次跳回new.html文件,响应浏览器,显示结果
4. 静态文件配置
1 项目目录下创建一个文件夹,例如名为jingtaiwenjianjia,将所有静态文件放到这个文件夹中 2 settings配置文件中进行下面的配置 # 静态文件相关配置 STATIC_URL = '/abc/' #静态文件路径别名 STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'jingtaiwenjianjia'), ] 3 引入<link rel="stylesheet" href="/abc/css/index.css"> 4.写引入文件的小窍门 用别名时,写路径过程中没有提示,可以先写真正的名字,有提示,当所有路径写全后,再改为别名