Python攻城师的成长————Django框架(模板层)

本文详细介绍了Django框架中的模板语法,包括过滤器、标签的使用,以及如何自定义过滤器、标签和inclusion_tag。同时,讲解了模板的导入、继承,测试环境搭建和ORM查询关键字的应用,是Python后端开发者进阶的宝贵资源。

今日学习目标

  • 熟悉模块基础知识点学习


学习内容

  • 模板语法之过滤器
  • 模板语法之标签(类似于流程控制)
  • 自定义过滤器、标签、inclusion_tag
  • 模板的导入
  • 模板的继承
  • 测试环境搭建
  • ORM查询关键字使用

一、模板语法之过滤器

优点:类似于内置函数
特点:会将|左边的当做过滤器的第一个参数,将右边的当做过滤器第二个参数。

过滤器类似于python的内置函数,用来把视图传入的变量值加以修饰后再显示,具体语法如下

{{ 变量名|过滤器名:传给过滤器的参数 }}

常用内置过滤器

1、default
#作用:如果一个变量值是False或者为空,使用default后指定的默认值,否则,使用变量本身的值,如果value=’‘则输出“nothing”
{{ value|default:"nothing" }}

2、length
#作用:返回值的长度。它对字符串、列表、字典等容器类型都起作用,如果value是 ['a', 'b', 'c', 'd'],那么输出是4
{{ value|length }}

3、filesizeformat
#作用:将值的格式化为一个"人类可读的"文件尺寸(如13KB、4.1 MB、102bytes等等),如果 value 是 12312312321,输出将会是 11.5 GB
{{ value|filesizeformat }}

4、date
#作用:将日期按照指定的格式输出,如果value=datetime.datetime.now(),按照格式Y-m-d则输出2019-02-02
{{ value|date:"Y-m-d" }}  

5slice
#作用:对输出的字符串进行切片操作,顾头不顾尾,如果value=“egon“,则输出"eg"
{{ value|slice:"0:2" }} 

6、truncatechars
#作用:如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾,如果value=”hello world egon 嘎嘎“,则输出"hello...",注意8个字符也包含末尾的3个点
{{ value|truncatechars:8 }}

7、truncatewords
#作用:同truncatechars,但truncatewords是按照单词截断,注意末尾的3个点不算作单词,如果value=”hello world egon 嘎嘎“,则输出"hello world ..."
{{ value|truncatewords:2 }}

8、safe
#作用:出于安全考虑,Django的模板会对HTML标签、JS等语法标签进行自动转义,例如value="<script>alert(123)</script>",模板变量{{ value }}会被渲染成<script>alert(123)</script>交给浏览器后会被解析成普通字符”<script>alert(123)</script>“,失去了js代码的语法意义,但如果我们就想让模板变量{{ value }}被渲染的结果又语法意义,那么就用到了过滤器safe,比如value='<a href="https://www.baidu.com">点我啊</a>',在被safe过滤器处理后就成为了真正的超链接,不加safe过滤器则会当做普通字符显示’<a href="https://www.baidu.com">点我啊</a>‘
{{ value|safe }}
内置过滤器safe用来前后端取消转义(前端代码并不一定非要在前端写,也可以在后端写好,传递给前端页面)

前端取消转义:|safe

后端取消转义:要先导一个模块:
from django.utils.safestring import mark_safe
sss = "<a href='www.baidu.com'>渡我不渡她</a>"
res = mark_safe(sss)
# 再把这个res传到前端
<p>{{ res }}</p> # 前端就能识别a标签了

9、add
给value加上一个add后面的数值
eg:给前端传个n=123,`{{ n|add:100 }}`这个过滤器结果就是n+100,在页面上显示的结果就是223.

补充
在这里插入图片描述
续表:
在这里插入图片描述

二、模板语法之标签(类似于流程控制)

标签语法结构:

	{% 名字 ...%}
  {% end名字 %}

常见使用:if判断,for循环、with标签等。

if判断

	{% if 条件1 %}
    <p>你好啊</p>
  {% elif 条件2 %}
    <p>他好呀</p>
  {% else %}
    <p>大家好</p>
  {% endif %}

for循环

#1、遍历每一个元素:
{% for person in person_list %}
    <p>{{ person.name }}</p>
{% endfor %}

#2、可以利用{% for obj in list reversed %}反向循环。

#3、遍历一个字典:
{% for key,val in dic.items %}
    <p>{{ key }}:{{ val }}</p>
{% endfor %}

{% for key in dic.keys %}
    <p>{{ key }}</p>
{% endfor %}

{% for val in dic.values %}
    <p>{{ val }}</p>
{% endfor %}

#4、循环序号可以通过{{ forloop }}显示 
forloop.counter            当前循环的索引值(从1开始)
forloop.counter0           当前循环的索引值(从0开始)
forloop.revcounter         当前循环的倒序索引值(从1开始)
forloop.revcounter0        当前循环的倒序索引值(从0开始)
forloop.first              当前循环是第一次循环则返回True,否则返回False
forloop.last               当前循环是最后一次循环则返回True,否则返回False
forloop.parentloop         本层循环的外层循环

#5、for标签可以带有一个可选的{% empty %} 从句,在变量person_list为空或者没有被找到时,则执行empty子句
{% for person in person_list %}
    <p>{{ person.name }}</p>

{% empty %}
    <p>sorry,no person here</p>
{% endfor %}

with标签

# with标签用来为一个复杂的变量名起别名,如果变量的值来自于数据库,在起别名后只需要使用别名即可,无需每次都向数据库发送请求来重新获取变量的值
{% with li.1.upper as v %}
    {{ v }}
{% endwith %}

三、自定义过滤器、标签、inclusion_tag

步骤:

  1. 在应用名下面新建一个templatetags文件夹(必须叫这个名字)

  2. 在该文件夹下,新建一个任意名称的py文件

  3. 在该py文件内,固定先写两行代码:
    from django.template import Library
    ​ register = Library()

自定义过滤器
视图层
py文件

from django.template import Library
register = Library()

@register.filter(name='myplus')
def index(a, b):
return a+b

模板层
HTML文件

{% load my_tag %}
{{ 123|myplus:123 }}

结果
这样前端页面显示的结果就是246

自定义标签
视图层
py文件

from django.template import Library
register = Library()

@register.simple_tag(name='mysm')
def login(a, b, c, d):
return '%s/%s/%/%s'%(a, b, c, d)

模板层
HTML文件

{% load my_tag %}
{% mysm 1 2 3 4 %}

结果
结果是1/2/3/4

自定义过滤器和标签的区别

#1、自定义过滤器只能传两个参数,而自定义标签却可以传多个参数

#2、过滤器可以用于if判断,而标签不能
{% if salary|my_multi_filter:12 > 200 %}
    <p>优秀</p>
{% else %}
    <p>垃圾</p>
{% endif %}

自定义inclusion_tag
视图层
py文件

@register.inclusion_tag('left.html')
def func2(n):
    l1 = []
    for i in range(1, n + 1):
        l1.append(f'第{i}页')
    return locals()
{% func2 10 %}

模板层
HTML文件

<ul>
    {% for foo in l1 %}
        <li>{{ foo }}</li>
    {% endfor %}
</ul>
'''该方法需要先作用于一个局部html页面 之后将渲染的结果放到调用的位置'''

四、模板的导入

类似于将html页面上的局部页面做成模块的形式 哪个地方想要直接导入即可展示

eg:有一个非常好看的获取用户数据的页面 需要在网站的多个页面上使用
  	策略1:拷贝多份即可
    策略2:模板的导入
   
使用方式
	{% include 'menu.html' %}

作用:在一个模板文件中,引入/重用另外一个模板文件的内容

五、模板的继承

extends标签和block标签

实现需要在要继承的模板中,通过block划定区域

{% block 区域名字 %}

{% endblock %}

子模板中如何使用

# include有的功能extends全都有,但是extends可以搭配一个block标签,用于在继承的基础上定制新的内容
{% extends '想要继承的模板' %}

{% block 区域名字 %}
	<h1>登录页面</h1>
{% endblock %}

一个页面上block块越多,页面的扩展性越高,通常情况下,都应该有三片区域

{% block content %}

{% endblock %}
{% block css %}

{% endblock %}
{% block js %}

{% endblock %}

总结与注意

#1、标签extends必须放在首行,base.html中block越多可定制性越强

#2、include仅仅只是完全引用其他模板文件,而extends却可以搭配block在引用的基础上进行扩写

#3、子模板中变量{{ block.super }} 可以重用父类的内容,然后在父类基础上增加新内容,而不是完全覆盖

#4、为了提升可读性,我们可以给标签{% endblock %} 起一个名字 。例如:
    {% block content %}
    ...
    {% endblock content %}  
#5、在一个模版中不能出现重名的block标签。

六、django测试环境搭建

拷贝manage.py文件中的四行代码到tests.py文件中,再在tests.py中写两行代码

import os

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Books_Manage_System.settings")
import django
django.setup()
# 就可以在下面测试django任何的py文件

七、ORM查询关键字使用

应知应会13条方法

名称用法
all()查所有的数据,结果是Queryset对象,但是是惰性查询,要用数据的时候才去查数据显示出来,不用的话不去查
filter()也是惰性查询,结果也是Queryset对象,需要查询条件
get()查数据对象本身,不推荐使用
order_by()排序,默认升序,括号里的条件加负号就是降序
reverse()反转:前面必须是经过order_by()排序的数据才能反转
exclude()除满足条件的数据外的所有数据
values()括号里也要条件,结果也是Queryset对象,列表套字典
values_list()括号里也要条件,结果也是Queryset对象,列表套元组
count()统计数据的条数
distinct()去重:数据必须是完全一模一样的情况下才能去重
exists()判断数据是否存在,返回结果True或False,没有什么用
first()拿第一个
last()拿最后一个

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值