Django学习笔记

 目录

 


遗留问题

  • 管理员模块重置密码

错误合集

 错误:python manage.py makemigrationsc成功后python manage.py migrate报错1193, “Unknown system variable ‘default_storage_engine‘“

原因:当时使用mysql5.0,版本过低与Django不匹配,需换成5.5以上

解决办法:卸载原MySQL5.0,安装5.7,具体步骤参考卸载MySQL_Gabriel_wei的博客-CSDN博客_卸载mysql

 

参考网上意见选择Navicat Premium 12与MySQL5.7匹配

错误:先打开Navicat后打开注册机导致激活失败

解决办法:卸载Navicat重装,然后先进行激活,具体步骤参考

Navicat Premium最新注册机-Navicat Keygen Patch下载v6.3.1最新版-西西软件下载

Navicat Premium 12安装包和注册机打包下载

链接:https://pan.baidu.com/s/1gg9WZOqZevAk4V5J87FJbg 
提取码:3m0k 

MySQL5.7打包

链接:https://pan.baidu.com/s/1IEtaZN8JFcVlqOunx1E6Bw 
提取码:23b5  

 

错误:执行以下代码时未成功删除

UsersInfo.objects.filter(name="膳魔师").delete()

原因:未把orm一整个函数执行完整

解决办法:访问网页完成整个函数的访问

​ 

 

错误:安装完mysqlclient库后import mysqlclient成功但是运行时报错缺少mysqlclient模块

原因:未探索

解决办法:import MySQLdb

 


一、Django是什么?

Django是一个开放源代码Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。

模型(model):是数据处理层,主要处理与数据相关的所有事务,例如数据的存取、验证和数据之间的关系。

模板(tempates):表现层,处理与表现相关的决定,例如文档和页面的显示。

视图(View):业务逻辑层,存取模型以及调取合适模板的相关逻辑,是模型和模板之间的桥梁。


 

二、Django架构处理请求的流程

1.客户端发来的HTTP请求被视为Django的请求对象。

2.URL分配器负责搜索并调用被请求的URL所对应的视图

3.被调用的视图根据情况使用模型或模板生成相应的对象

4.相应对象作为HTTP形影发回给用户


 

三、使用步骤

1.创建项目(后面启动时用什么方式创建就用什么方式启动)

Django中项目会有一些默认的文件和默认的文件夹

        1.1 终端方式

  • 打开终端(win+R)
  • 进入项目目录
  • 执行命令创建项目(未实验过,可能存在问题)
    • Python安装目录\django-admin startproject 项目名称

        1.2 Pycharm方式(需要专业版,社区版没有这个功能) 

  •         

         1.3 两种方法对比

                 最标准的是使用命令行创建方式,pycharm方式在标准基础上加上了

                [1]templates目录(可以删除掉)

                [2]在setting.py中的TEMPLATES中给DIRS加上了内容,而标准版没有加(可以删除)

                 

                 

 2.文件介绍

        

 3.APP

创建app代码

python manage.py startapp app01

 

 

 


 

四、快速上手

1.实现一些功能

        1.1 注册app

    

         1.2 编写URL和视图函数对应关系

 

render方法的作用——结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。通俗的讲就是把context的内容, 加载进templates中定义的文件, 并通过浏览器渲染呈现

render(request, template_name, context, content_type, status, using)
  • request:浏览器向服务器发送的请求对象,包含用户信息、请求内容和请求方式等。
  • template_name:设重模板文件名,用于生成网页内容。
  • context:对模板上下文(模板变量)赋值,以字典格式表示,默认情况下是一个空字典。
  • content_type:响应内容的数据格式,一般情况下使用默认值即可。
  • status:HTTP状态码,默认为200。
  • using:设置模板引擎,用于解析模板文件,生成网页内容

 

  • 导入views模块
  • 添加对应关系
  • 编写视图函数 

1.3 启动Django项目

        1.3.1 命令行启动 

python manage.py runserver

 

        1.3.2 pycharm启动 

2 templates模板

 优先去项目根目录的templates中寻找(需要提前配置,不配置无效),然后根据app的注册顺序,在每个app下的templates目录中寻找

 

3.静态文件

在开发过程中一般将图片、css、js都当做静态文件处理

 

五、模板语法

其本质是在HTML中写一些占位符,由数据对这些占位符进行替换和处理

对于元组的循环

{% for item in n2 %}
    <span>{{ item }}</span>
{% endfor %}

对于字典的循环

{% for k,v in n3.items %}
    <div>{{ k }} {{ v }}</div>
{% endfor %}

分支

{% if n1 == "韩超" %}
    <h1>是韩超</h1>
{% elif n1 == "黄蓉" %}
    <h1>不是韩超,是黄蓉</h1>
{% else %}
    <h1>不是韩超,也不是黄蓉,是其他人</h1>
{% endif %}

 

六、数据库

1.ORM

ORM可以做

  • 创建、修改、删除数据库中的表(无法创建数据库)
  • 操作表中的数据

2.orm创建数据库

  1. 启动MySql服务
  2. 创建数据库
create database 数据库名 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

3.orm连接数据库

4.orm创建修改表结构

类创建表

修改表结构 

 

5.orm增删改查

 url.py中指定

 在view.py中定义一个orm函数,实现对数据的增删改查

​ 

 

 七、用户管理系统案例

  1.步骤

    1.1 url定向

    1.2 view.py中定义函数

​ 

1.3 前端界面

复制代码
<body>
    <h1>info列表</h1>
    <table border="1">
        <thead>
            <tr>
            <th>ID</th>
            <th>姓名</th>
            <th>密码</th>
            <th>年龄</th>
        </tr>
        </thead>
        <tbody>
            <tr>
                <td>1</td>
                <td>小黑</td>
                <td>123456</td>
                <td>19</td>
            </tr>
        </tbody>
    </table>
</body>
复制代码

 

1.4 创建注册app

      • python manage.py startapp app01
        INSTALLED_APPS=[
            'app01.apps.App01Config'
        ]

否则app下的models.py写类时,无法在数据库中创建表 

2. 静态文件管理

    • 配置数据库连接settings.py
      
          DATABASES = {
              'default': {
                  'ENGINE': 'django.db.backends.mysql',
                  'NAME': '数据库名字', 
                  'USER': 'root',
                  'PASSWORD': '密码',
                  'HOST': '127.0.0.1',  # 哪台机器安装了MySQL
                  'PORT': 330X,
              }
          }
    • 在app下的models.py中编写
      
          ```python
          from django.db import models
          
          
          class Admin(models.Model):
              """ 管理员 """
              username = models.CharField(verbose_name="用户名", max_length=32)
              password = models.CharField(verbose_name="密码", max_length=64)
          
              def __str__(self):
                  return self.username
          
              
          class Department(models.Model):
              """ 部门表 """
              title = models.CharField(verbose_name='标题', max_length=32)
          
              def __str__(self):
                  return self.title
          ```
      
        - 执行两个命令:
      
          ```python
          >>>python manange.py makemigrations
          >>>python manange.py migrate

3.部门管理

4.模板继承

5.用户管理

6.靓号管理

6.1 表结构

6.2 靓号列表

6.3 新建靓号

6.4 编辑靓号

6.5搜索手机号

      • 查询匹配方式:

    # 典型查询方式
    PrettyNumber.objects.filter(Number="xxxxx",id=123)
    # 字典方式查询
    dict={"Number":"xxxxx","id":123}
    PrettyNumber.objects.filter(**dict)
      • 数字:

    PrettyNumber.objects.filter(id=123) #id等于123
    PrettyNumber.objects.filter(id__gt=123) #id大于123
    PrettyNumber.objects.filter(id__gte=123)  # id大于等于123
    PrettyNumber.objects.filter(id__lt=123)  # id小于123
    PrettyNumber.objects.filter(id__lte=123)  # id小于等于123
    dict={"id__lte":123}
    PrettyNumber.objects.filter(**dict)  #使用字典方式必须加**
      • 字符:

    PrettyNumber.objects.filter(Number="xxxxx")  #筛选出等于xxxxx
    PrettyNumber.objects.filter(Number__startswith="xxxxx")  #筛选出以xxxxx开头
    PrettyNumber.objects.filter(Number__endswith="xxxxx")  # 筛选出以xxxxx结尾
    PrettyNumber.objects.filter(Number__contains="xxxxx")  # 筛选出包含xxxxx
    dict={"Number__contains":"xxxxx"}
    PrettyNumber.objects.filter(**dict)#使用字典方式必须加**
      • 分页:

PrettyNumber.objects.filter(id=x)[0:10] #筛选出id等于x数据的前十条
PrettyNumber.objects.all()[0:10]    #筛选出所有数据的前十条

6.6 时间插件

 

7.ModelForm和Bootsrap

7.1 modelform可以帮助生成HTML标签

7.2 插件

 

8. 管理员操作

8.1 添加管理员表

8.2 编辑管理员

8.3 删除和重置密码

9. 用户登录

9.1 用户认证

9.1.1 cookie和session

        • 修正无状态&短链接的弊端
        • 是保存在浏览器上的键值对
        • 发送请求时自动携带

9.1.2 中间件处理

        • 中间件是一个又一个类
        • 执行时在中途被拦截,用户请求到达不了视图函数
        • 在middelware中注册中间件
        • 在中间件的process_request方法中,如果没有返回值则说明有访问权限可以继续往下走,如果有返回值则说明没有访问权限不能继续往下走

9.1.3 中间件实现登录校验

获取当前访问用户的session信息,如果能读到说明已登陆过

9.2 退出登陆

10. 图片验证码

10.1 生成图片

      1. 安装pillow库
    •  
    •  
      1. 创建一个内存中的文件,将图片内容写到内存文件中,在内存中把原始值获取到
      2. 使用pop的原因:在进行数据库用户名密码校验时,因为数据库中没有code字段,所以要在比较时将code剔除掉

10.2 验证图片

11. Ajax请求

11.1 浏览器向网站发送请求时:URL和表单形式

      • GET
      • POST
      • 页面会刷新

11.2 基于Ajax向后台发送请求,不会刷新

      • 依赖jQuery
      • 编写Ajax代码
        $.ajax({
            url:"发送的地址",
            type:"post",
            data:{
                传递的参数
            },
            success:function(res){
                console.log(res);
            }
        })

11.3 GET请求

      • $.ajax({
                url:'/task/ajax',
                type:"get",
                data:{
                    n1:123,
                    n2:456
                },
                success:function (res){
                    console.log(res);
                }
        
        def task_ajax(request):
            #测试发送的数据
            print(request.GET)
            return HttpResponse("成功了")

11.4 POST请求

      • from django.views.decorators.csrf import csrf_exempt
        # 免除csrf token认证
        @csrf_exempt
        def task_ajax(request):
            #测试发送的数据
            print(request.GET)
            return HttpResponse("成功了")

11.5 Ajax请求的返回值

一般都会返回json格式

12. 文件上传

12.1 单个上传

      • file_object=request.FILES.get("exc")
        print(file_object)
        # 对象传递给openpyxl,由openpyxl读取文件的内容
        wb=load_workbook(file_object)
        sheet=wb.worksheets[0]
        # 获取指定单元格的内容
        cell=sheet.cell(1,2)
        print(cell.value)

 

12.2 批量上传

      • from openpyxl import load_workbook
        for row in sheet.iter_rows(min_row=2):
            text=row[0].value
            exists=Department.objects.filter(title=text).exists()
            # 如果与数据库中现有数据无重复,则向数据库添加
            if not exists:
            Department.objects.create(title=text)

12.3 混合数据

提交页面时:用户输入数据+文件(输入不能为空、报错)

 

 

 

        

                

        

 

 

 


总结

posted @   八边形战士S君  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示