Django高级应用

一,静态文件

  1. 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.js

    console.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. 使用反向解析的思路写样式文件路径
    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 查看效果
    在这里插入图片描述

二,中间件的应用

  1. 概述:一个轻量级、底层的插件,可以介入Django的请求和响应
  2. 本质:一个Python类
  3. 方法:
    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. 使用自定义中间件
    4.1 \Django\MyDjango\project\middleware\MyApp\MyMiddleWare.py 在此文件中增加以下内容
    from django.utils.deprecation import MiddlewareMixin
    class MyMiddle(MiddlewareMixin):
    	def process_request(self,request):
    		print("get参数为:",request.GET.get("a"))
    
    4.2 在 \Django\MyDjango\project\project\settings.py 文件中的 MIDDLEWARE 列表中增加中间件类路径
    'middleware.MyApp.MyMiddleWare.MyMiddle',
    
    4.3 访问页面,查看控制台输出
    在这里插入图片描述

三,上传图片

  1. 概述:文件上传时,文件数据存储在requestFILES属性中
  2. 存储路径:
    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')
    
  3. 编辑前端页面:\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>
  1. 编辑 \Django\MyDjango\project\MyApp\urls.py 文件
	url(r'^UpFile/$',views.UpFile),
	url(r'^SaveFile/$',views.SaveFile),
  1. 编辑 \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("上传失败")

四,分页

  1. 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() 传递一个有效值,但是该页面没有数据时抛出

  2. 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():返回当前页的数据(对象)个数

  3. Paginator 对象与 Page 对象的关系 在这里插入图片描述

  4. 示例代码
    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. 页面中增加页码信息
    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 效果展示
    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西门一刀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值