Django之模板层

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()	# 拿最后一个

posted @ 2022-12-14 22:21  知了了了了  阅读(16)  评论(0编辑  收藏  举报