Django之模板层
模板语法传值
方法一、
# 指名道姓的传,不会浪费空间
return render(request, 'modal.html', {'name':name})
方法二、(关键字:locals)
# 将整个局部名称空间中的名字全部传入;简单快捷
return render(request,'modal.html',locals())
"""
django提供的模板语法只有两个符号:
{{}}:主要用于变量相关操作(引用)
{%%}:主要用于逻辑相关操作(循环、判断)
"""
传值范围:基本数据类型都可以
# 函数名
模板语法会自动加括号执行并将函数的返回值展示到页面上
不支持传参(模板语法会自动忽略有参函数)
# 文件名
直接显示文件IO对象
# 类名
类名的传递也会自动加括号产生对象并展示到页面上
自动加括号实例化成对象
# 对象名
直接显示对象的地址,并且具备调用属性和方法的能力
"""
模板语法会判断每一个名字是否可调用 如果可以则调用!!!
django模板语法针对容器类型的取值 只有一种方式>>>:句点符
既可以点key也可以点索引 django内部自动识别
"""
HTML文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--调用字符串对象的upper方法,注意不要加括号-->
<p>{{ msg.upper }}</p>
<!--取字典中k1对应的值-->
<p>{{ dic.k1 }}</p>
<!--取对象的name属性-->
<p>{{ obj.name }}</p>
<!--取列表的第2个元素,然后变成大写-->
<p>{{ li.1.upper }}</p>
<!--取列表的第3个元素,并取该元素的age属性-->
<p>{{ li.2.age }}</p>
</body>
</html>
模板层之标签
# 标签语法结构:
{% 标签名字 ...%}
{% end名字 %}
常见使用:if判断,for循环、with标签等。
# if 判断
{% if 条件 %} 条件一般是模板语法传过来的数据 直接写名字使用即可
条件成立执行的代码
{% elif 条件1 %}
条件1成立执行的代码
{% else %}
条件都不成立执行的代码
{% endif %}
# for 循环
{% for i in l1 %}
{% if i == 1 %}
<p>我是{{ i }}</p>
{% elif i == 2 %}
<p>我是{{ i }}</p>
{% else %}
<p>我是3</p>
{% endif %}
{% endfor %}
# with标签
with标签用来为一个复杂的变量名起别名,如果变量的值来自于数据库,在起别名后只需要使用别名即可,无需每次都向数据库发送请求来重新获取变量的值
{% with li.1.upper as v %}
{{ v }}
{% endwith %}
自定义过滤器、标签及inclusion_tag
"""
步骤:
在应用名下面新建一个templatetags文件夹(必须叫这个名字)
在该文件夹下,新建一个任意名称的py文件
在该py文件内,固定先写两行代码:
from django.template import Library
register = Library()
"""
# 自定义过滤器(最大只能接收两个参数)
@register.filter(name='myadd')
def func1(a, b):
return a + b
{% load mytags %}
<p>{{ i|myadd:1 }}</p>
# 自定义标签(参数没有限制)
@register.simple_tag(name='mytag')
def func2(a, b, c, d, e):
return f'{a}-{b}-{c}-{d}-{e}'
{% load mytags %}
{% mytag 'jason' 'kevin' 'oscar' 'tony' 'lili' %}
# 自定义inclusion_tag(局部的html代码)
@register.inclusion_tag('menu.html',name='mymenu')
def func3(n):
html = []
for i in range(n):
html.append('<li>第%s页</li>'%i)
return locals()
{% load mytags %}
{% mymenu 20 %}
模板的继承与导入
关键词:extends标签和block标签
# 实现需要在要继承的模板中,通过block划定区域
{% block 区域名字 %}
{% endblock %}
# 子模版如何使用
include有的功能extends全都有,但是extends可以搭配一个block标签,用于在继承的基础上定制新的内容
{% extends '想要继承的模板' %}
{% block 区域名字 %}
<h1>登录页面</h1>
{% endblock %}
"""
1、标签extends必须放在首行,base.html中block越多可定制性越强
2、include仅仅只是完全引用其他模板文件,而extends却可以搭配block在引用的基础上进行扩写
3、子模板中变量{{ block.super }} 可以重用父类的内容,然后在父类基础上增加新内容,而不是完全覆盖
4、为了提升可读性,我们可以给标签{% endblock %} 起一个名字 。例如:
{% block content %}
...
{% endblock content %}
5、在一个模版中不能出现重名的block标签。
"""
# 模块的导入
类似于将html页面上的局部页面做成模块的形式 哪个地方想要直接导入即可展示
eg:有一个非常好看的获取用户数据的页面 需要在网站的多个页面上使用
策略1:拷贝多份即可
策略2:模板的导入
使用方式
{% include 'menu.html' %}
作用:在一个模板文件中,引入/重用另外一个模板文件的内容
模型层之前期准备
1.自带的sqlite3数据库对时间字段不敏感有时候会展示错乱,所以我们习惯切换成常见的数据库比如MySQL django orm并不会自动帮你创建库,所以需要提前准备好
2.单独测试django某个功能层
默认不允许单独测试某个py文件 如果想要测试某个py文件(主要models.py)
测试环境1:pycharm提供的python console
测试环境2:自己搭建(自带的test或者自己创建)
1.拷贝manage.py前四行
2.自己再加两行
import django
django.setup()
3.django orm底层还是SQL语句 我们是可以查看的
如果我们手上是一个QuerySet对象 那么可以直接点query查看SQL语句
如果想查看所有orm底层的SQL语句也可以在配置文件添加日志记录
ORM常用关键字
all()
# 查所有的数据,结果是Queryset对象,但是是惰性查询。要用数据的时候才去查数据显示出来,不用的话不去查
filter()
# 也是惰性查询,结果也是Queryset对象,需要查询条件
get()
# 查数据对象本身,不推荐使用
order_by()
# 排序,默认升序,括号里的条件加负号就是降序
reverse()
# 反转:前面必须是经过order_by()排序的数据才能反转
exclude()
# 除满足条件的数据外的所有数据
values()
# 括号里也要条件,结果也是Queryset对象,列表套字典
values_list()
# 括号里也要条件,结果也是Queryset对象,列表套元组
count() # 统计数据的条数
distinct()
# 去重:数据必须是完全一模一样的情况下才能去重
exists()
# 判断数据是否存在,返回结果True或False,没有什么用
first() # 拿第一个
last() # 拿最后一个