一,静态文件
-
css,js,图片,json文件,字体文件等
1.1 新建以下目录:\Django\MyDjango\project\static\MyApp\css \Django\MyDjango\project\static\MyApp\font \Django\MyDjango\project\static\MyApp\image \Django\MyDjango\project\static\MyApp\js \Django\MyDjango\project\static\MyApp\json \Django\MyDjango\project\static\MyApp\other
1.2 settings.py 文件中设置静态文件路径
STATICFILES_DIRS = [ os.path.join(BASE_DIR,"static") ]
1.3 添加css文件 \Django\MyDjango\project\static\MyApp\css\style.css
h1{ color:red; }
1.4 添加图片文件\Django\MyDjango\project\static\MyApp\image\1.png
1,5 添加js文件 \Django\MyDjango\project\static\MyApp\js\sunck.jsconsole.log("打印输出")
1.6 添加测试样式的HTML文件\Django\MyDjango\project\templates\MyApp\IndexStatic.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>首页</title> <link rel="stylesheet" type="text/css" href="/static/MyApp/css/style.css"/> <script type="text/javascript" src="/static/MyApp/js/sunck.js"></script> </head> <body> <h1> Sunck is a good man! </h1> <img src="/static/MyApp/image/1.png"> </body> </html>
1.7 访问页面,查看效果
-
使用反向解析的思路写样式文件路径
2.1 \Django\MyDjango\project\project\settings.py 添加以下内容STATICFILES_DIRS = [ os.path.join(BASE_DIR,"static")]
2.2 样式文件路径不变
2.3 \Django\MyDjango\project\templates\MyApp\IndexStatic.html 文件增加图片文件相对路径和绝对路径{% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>首页</title> <link rel="stylesheet" type="text/css" href="/static/MyApp/css/style.css"/> <script type="text/javascript" src="/static/MyApp/js/sunck.js"></script> </head> <body> <h1> Sunck is a good man! </h1> <img src="/static/MyApp/image/1.png"> <img src="{% static '/MyApp/image/1.png' %} "> </body> </html>
2.4 查看效果
二,中间件的应用
- 概述:一个轻量级、底层的插件,可以介入Django的请求和响应
- 本质:一个Python类
- 方法:
3.1 _init_.py :不需要传参数,服务器响应第一个请求的时候自动调用,用于确定是否启用该中间件
3.2 process_request(self,request):在执行视图之前被调用(分配url之后,匹配视图之前),每个请求上都会调用,返回None或HttpResponse对象
3.3 process_view(self,request,view_func,view_args,view_kwargs):调用视图之前执行,每个请求都会调用,返回None或HTTPResponse对象
3.4 process_template_response(self,request,response):视图调用结束后立即调用,每个请求都会调用,返回None或HttpResponse对象;使用render
3.5 process_response(self,request,response):所有响应返回浏览器之前调用,每个请求都会调用,返回HttpResponse对象
3.6 process_exception(self,request,exception):当视图抛出异常时调用,返回HttpResponse对象 - 使用自定义中间件
4.1 \Django\MyDjango\project\middleware\MyApp\MyMiddleWare.py 在此文件中增加以下内容
4.2 在 \Django\MyDjango\project\project\settings.py 文件中的 MIDDLEWARE 列表中增加中间件类路径from django.utils.deprecation import MiddlewareMixin class MyMiddle(MiddlewareMixin): def process_request(self,request): print("get参数为:",request.GET.get("a"))
4.3 访问页面,查看控制台输出'middleware.MyApp.MyMiddleWare.MyMiddle',
三,上传图片
- 概述:文件上传时,文件数据存储在requestFILES属性中
- 存储路径:
2.1 在 \Django\MyDjango\project\static 文件下创建 UpFile 目录,用于存储接收上传的文件
2.2 配置settings.py \Django\MyDjango\project\project\settings.py 文件中增加MEDIA_ROOT = os.path.join(BASE_DIR,r'static\UpFile')
- 编辑前端页面:\Django\MyDjango\project\templates\MyApp\UpFile.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传文件</title>
</head>
<body>
<form method="post" action="/sunck/SaveFile/" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="File"/>
<input type="submit" value="上传">
</form>
</body>
</html>
- 编辑 \Django\MyDjango\project\MyApp\urls.py 文件
url(r'^UpFile/$',views.UpFile),
url(r'^SaveFile/$',views.SaveFile),
- 编辑 \Django\MyDjango\project\MyApp\views.py 文件
def UpFile(request):
return render(request,"MyApp/UpFile.html")
def SaveFile(request):
import os
from django.conf import settings
if request.method == "POST":
ServerFile = request.FILES.get("File")
# 合成文件在服务器端路径
FilePath = os.path.join(settings.MEDIA_ROOT,ServerFile.name)
print("FilePath:",FilePath)
with open(FilePath,"wb") as FileObj:
for FileInfo in ServerFile.chunks():
FileObj.write(FileInfo)
return HttpResponse("上传成功")
else:
return HttpResponse("上传失败")
四,分页
-
Paginator 对象:
1.1 创建对象:
1.1.1 格式:Pagintor(列表,整数)
1.1.2 返回值:返回分页的对象
1.2 属性:
1.2.1 count:对象总数
1.2.2 num_pages:页面总数
1.2.3 page_range:页码列表
1.3 方法:page(num):获得一个page对象
1.4 异常:
1.4.1 InvalidPage:向 page() 传递一个无效页码时抛出
1.4.2 PageNotAnInterger:向 page() 传递的不是一个整数时抛出
1.4.3 EmptyPage:向 page() 传递一个有效值,但是该页面没有数据时抛出 -
Page 对象
2.1 创建对象:Paginator 对象的 page() 方法返回得到 Page 对象,不需要手动创建
2.2 属性:
2.2.1 object_list:当前页面上所有的数据(对象)列表
2.2.2 number:当前的页码值
2.2.3 pagintor:当前 page 对象关联的 paginator 对象
2.3 方法:
2.3.1 has_next():判断是否有下一页,如果有返回True
2.3.2 has_previous():判断是否有上一页,如果有返回True
2.3.3 has_other_pages():判断是否有上一页或下一页,如果有一个返回True
2.3.4 next_page_number():返回下一页的页码,如果下一页不存在,抛出 InvalidPage 异常
2.3.5 previous_page_number():返回上一页的页码,如果上一页不存在,抛出 InvalidPage 异常
2.3.6 len():返回当前页的数据(对象)个数 -
Paginator 对象与 Page 对象的关系
-
示例代码
4.1 \Django\MyDjango\project\MyApp\urls.py 中增加访问地址url(r'^StudentPage/(\d+)/$',views.StudentPage),
4.2 \Django\MyDjango\project\MyApp\views.py 中增加视图信息
from .models import Student from django.core.paginator import Paginator def StudentPage(request,PageId): # 所有学生列表 AllStudentList = Student.StudentObj2.all() # 每页2条数据 PaginatorObj = Paginator(AllStudentList,2) PageData = PaginatorObj.page(PageId) print('PageData',PageData) return render(request,'MyApp/StudentPage.html',{"StudentsObj":PageData})
4.3 \Django\MyDjango\project\templates\MyApp\StudentPage.html 增加html页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>学生分页显示</title> </head> <body> <ul> 姓名--班级--年龄 {% for Students in StudentsObj %} <li> {{Students.studentName}}--{{Students.grade_id}}--{{Students.studentAge}} </li> {% endfor %} </ul> </body> </html>
4.4 效果展示
-
页面中增加页码信息
5.1 \Django\MyDjango\project\templates\MyApp\StudentPage.html 中增加以下代码<ul> {% for index in StudentsObj.paginator.page_range %} {% if index == StudentsObj.number %} <li> {{index}} </li> {% else %} <li> <a href="/sunck/StudentPage/{{index}}">{{index}}</a> </li> {% endif %} {% endfor %} </ul>
5.2 效果展示