七、Ajax(Django开发)

news2025/1/21 21:54:03

Ajax(Django开发)

    • 知识点的回顾:
    • 1.Ajax请求
    • 2.订单
    • 小结
    • 3.图表
    • 4.关于文件上传
      • 4.1基本操作
      • 案例:批量上传数据
      • 案例:混合数据(Form)
      • 4.2启用media
      • 案例:混合数据(form)
      • 案例:混合数据(ModelForm)
        • models.py
        • 定义ModelForm
        • 视图
      • 小结

知识点的回顾:

  • 安装Django

    pip install django
    
  • 创建Django项目

    >>> django-admin startproject mysite
    

    注意:Pycharm可以创建。如果Pycharm创建,记得settings.py中的DIR templates删除。

  • 创建app&注册

    >>>python manage.py startapp app01
    >>>python manage.py startapp app02
    >>>python manage.py startapp app03
    
    INSTALLED_APPS = [
        "django.contrib.admin",
        "django.contrib.auth",
        "django.contrib.contenttypes",
        "django.contrib.sessions",
        "django.contrib.messages",
        "django.contrib.staticfiles",
        "app01.apps.App01Config"
    ]
    

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

  • 配置静态文件路径&模板的路径(放在app目录下)。

  • 配置数据库相关操作(MySQL)

    • 第三方模块(django3版本)

      pip install mysqlclient
      
    • 自己先去MySQL创建一个数据库。

    • 配置数据库连接settings.py

      DATABASES = {
          'default':
              {
                  'ENGINE': 'django.db.backends.mysql',  # 数据库引擎
                  'NAME': 'gx_day16',  # 数据库名称
                  'HOST': '127.0.0.1',  # 数据库地址,本机 ip 地址 127.0.0.1
                  'PORT': 3306,  # 端口
                  'USER': 'root',  # 数据库用户名
                  'PASSWORD': 'xxxx',  # 数据库密码
              }
      }
      
    • 在app下的models.py中编写

      nfrom django.db import models
      
      
      class Admin(models.Model):
          """ 管理员 """
          username = models.CharField(max_length=32, verbose_name='用户名')
          password = models.CharField(max_length=64, verbose_name='密码')
      
          def __str__(self):
              return self.username
      
      
      class Department(models.Model):
          """ 部门表 """
          title = models.CharField(max_length=32, verbose_name='标题')
      
          def __str__(self):
              return self.title
      
    • 执行两个命令:

      >>>python manage.py makemigrations
      >>>python manage.py migrate
      
  • 在url.py,路由(url和函数的关系)

  • 在views.py,视图函数,编写业务逻辑

  • templates目录,编写HTML模板(含有模板语法、继承、{% static 'xx'%}

  • ModelForm & Form组件,在我们开发增删改查功能

    • 生成HTML标签(生成默认值)
    • 请求数据进行校验
    • 保存到数据库(ModelForm)
    • 获取错误信息
  • Cookie和Session,用户登录信息保存起来

  • 中间件,基于中间件实现用户认证,基于:process_request

  • ORM操作

    models.User.objects.filter(id="xxx")
    models.User.objects.filter(id="xxx").order_by("-id")
    
  • 分页组件

1.Ajax请求

2.订单

在这里插入图片描述

表结构

class Order(models.Model):
    """ 订单 """
    oid = models.CharField(max_length=64, verbose_name='订单号')
    title = models.CharField(max_length=32, verbose_name='名称')
    price = models.IntegerField(verbose_name='价格')

    status_choice = (
        (1, '待支付'),
        (2, '已支付'),
    )
    status = models.SmallIntegerField(choices=status_choice, verbose_name='状态', default=1)
    admin = models.ForeignKey(verbose_name="管理员", to="Admin", on_delete=models.CASCADE)

想要去数据库中获取数据时:对象/字典

# 对象,当前行的所有数据。
row_object = models.Order.objects.filter(id=uid).first()
row_object.id
row_object.title
# 字典,{"id":1,"title":"xx"}
row_dict = models.Order.objects.filter(id=uid).values("id","title").first()
# queryset = [obj,obj,obj]
queryset = models.Order.objects.all()
# queryset = [{"id":1,"title":"xx"},{"id":2,"title":"xx"},]
queryset = models.Order.objects.all().values("id","title")
# queryset = [(1,"xx"),(2,"xx"),]
queryset = models.Order.objects.all().values_list("id","title")

小结

3.图表

  • highchart,国外
  • echarts,国内

在这里插入图片描述

在这里插入图片描述

更多参考文档:https://echarts.apache.org/examples/zh/index.html#chart-type-line

4.关于文件上传

4.1基本操作

{% extends 'layout.html' %}

{% block content %}
    <div class="container">
        <form method="post" enctype="multipart/form-data">
            {% csrf_token %}
            <input type="text" name="username">
            <input type="file" name="avatar">
            <input type="submit" name="提交">
        </form>
    </div>
{% endblock %}
# 'username': ['lingze']
print(request.POST)  # 请求体中数据
# {'avatar': [<InMemoryUploadedFile: 1.png (image/png)>]}
print(request.FILES)   # 请求发过来的文件
from django.shortcuts import HttpResponse, render


def upload_list(request):
    if request.method == 'GET':
        return render(request, 'upload_list.html')

    # 'username': ['lingze']
    # print(request.POST)  # 请求体中数据
    # {'avatar': [<InMemoryUploadedFile: 1.png (image/png)>]}
    # print(request.FILES)   # 请求发过来的文件

    file_object = request.FILES.get("avatar")
    print(file_object.name)

    f = open(file_object.name, mode='wb')
    for chunk in file_object.chunks():
        f.write(chunk)
    f.close()

    return HttpResponse("....")


案例:批量上传数据

<form method="post" enctype="multipart/form-data" action="/depart/multi/">
	{% csrf_token %}
	<div class="form-group">
		<input type="file" name="exc">
	</div>
	<input type="submit" value="上传" class="btn btn-info btn-sm">
</form>
def depart_multi(request):
    """ 批量上传(Excel文件)"""
    # 1、获取用户上传的文件对象
    file_object = request.FILES.get('exc')
    print(type(file_object))

    # 2、直接打开Excel并读取内容
    wb = load_workbook(file_object)
    sheet = wb.worksheets[0]

    # 3、循环获取每一行数据
    for row in sheet.iter_rows(min_row=2):
        text = row[0].value
        exists = models.Department.objects.filter(title=text).exists()
        if not exists:
            models.Department.objects.create(title=text)

    return redirect('/depart/list/')

案例:混合数据(Form)

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

  • Form生成HTML标签:type=file
  • 表单的验证
  • form.cleaned_data 获取 数据 + 文件对象
{% extends 'layout.html' %}

{% block content %}

    <div class="container">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title">{{ title }}</h3>
            </div>
            <div class="panel-body">
                <form method="post" enctype="multipart/form-data" novalidate>
                    {% csrf_token %}

                    {% for field in form %}
                        <div class="form-group">
                            <label>{{ field.label }}</label>
                            {{ field }}
                            <span style="color: red">{{ field.errors.0 }}</span>
                        </div>
                    {% endfor %}

                    <button type="submit" class="btn btn-primary">提 交</button>
                </form>
            </div>
        </div>
    </div>

{% endblock %}
from django.shortcuts import HttpResponse, render
from django import forms
from app01.utils.bootstrap import BootStrapForm
import os
from app01 import models


def upload_list(request):
    if request.method == 'GET':
        return render(request, 'upload_list.html')

    # 'username': ['lingze']
    # print(request.POST)  # 请求体中数据
    # {'avatar': [<InMemoryUploadedFile: 1.png (image/png)>]}
    # print(request.FILES)   # 请求发过来的文件

    file_object = request.FILES.get("avatar")
    print(file_object.name)

    f = open(file_object.name, mode='wb')
    for chunk in file_object.chunks():
        f.write(chunk)
    f.close()

    return HttpResponse("....")


class UpForm(BootStrapForm):
    bootstrap_exclude_fields = ['img']
    name = forms.CharField(label="姓名")
    age = forms.IntegerField(label="年龄")
    img = forms.FileField(label="头像")


def upload_form(request):
    title = "Form上传"
    if request.method == 'GET':
        form = UpForm()
        return render(request, 'upload_form.html', {'title': title, 'form': form})

    form = UpForm(data=request.POST, files=request.FILES)
    if form.is_valid():
        # {'name': '吴佩琦2', 'age': 19, 'img': <InMemoryUploadedFile: apple.png (image/png)>}
        # print(form.cleaned_data)

        # 1、读取图片内容,写入到文件夹中并获取文件的路径。
        image_object = form.cleaned_data.get("img")

        db_file_path = os.path.join("static", "img", image_object.name)
        file_path = os.path.join("app01", "static", "img", image_object.name)
        f = open(file_path, 'wb')
        for chunk in image_object.chunks():
            f.write(chunk)
        f.close()

        # 2、将图片文件路径写入到数据库
        models.Boss.objects.create(
            name=form.cleaned_data.get("name"),
            age=form.cleaned_data.get("age"),
            img=db_file_path,
        )

        return HttpResponse("...")
    return render(request, 'upload_form.html', {'title': title, 'form': form})

注意:就目前而言,所有的静态文件都只能放在static目录。

在django的开发过程中两个特殊的文件夹:

  • static,存放静态文件的路径,包括:CSS、JS、项目图片。
  • media,用户上传的数据的目录。

4.2启用media

在urls.py中进行配置:

from django.conf import settings
from django.urls import path, re_path
from django.views.static import serve


re_path(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}, name='media'),

在settings.py中进行配置:

import os

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = "/media/"

在浏览器上访问这个地址:

在这里插入图片描述

案例:混合数据(form)

from django.shortcuts import HttpResponse, render
from django import forms
from app01.utils.bootstrap import BootStrapForm
import os
from app01 import models
from django.conf import settings


def upload_list(request):
    if request.method == 'GET':
        return render(request, 'upload_list.html')

    # 'username': ['lingze']
    # print(request.POST)  # 请求体中数据
    # {'avatar': [<InMemoryUploadedFile: 1.png (image/png)>]}
    # print(request.FILES)   # 请求发过来的文件

    file_object = request.FILES.get("avatar")
    print(file_object.name)

    f = open(file_object.name, mode='wb')
    for chunk in file_object.chunks():
        f.write(chunk)
    f.close()

    return HttpResponse("....")


class UpForm(BootStrapForm):
    bootstrap_exclude_fields = ['img']
    name = forms.CharField(label="姓名")
    age = forms.IntegerField(label="年龄")
    img = forms.FileField(label="头像")


def upload_form(request):
    title = "Form上传"
    if request.method == 'GET':
        form = UpForm()
        return render(request, 'upload_form.html', {'title': title, 'form': form})

    form = UpForm(data=request.POST, files=request.FILES)
    if form.is_valid():
        # {'name': '吴佩琦2', 'age': 19, 'img': <InMemoryUploadedFile: apple.png (image/png)>}
        # print(form.cleaned_data)

        # 1、读取图片内容,写入到文件夹中并获取文件的路径。
        image_object = form.cleaned_data.get("img")

        # media_path = os.path.join(settings.MEDIA_ROOT, image_object.name)
        media_path = os.path.join("media", image_object.name)
        # db_file_path = os.path.join("static", "img", image_object.name)
        # file_path = os.path.join("app01", "static", "img", image_object.name)
        f = open(media_path, 'wb')
        for chunk in image_object.chunks():
            f.write(chunk)
        f.close()

        # 2、将图片文件路径写入到数据库
        models.Boss.objects.create(
            name=form.cleaned_data.get("name"),
            age=form.cleaned_data.get("age"),
            img=media_path,
        )

        return HttpResponse("...")
    return render(request, 'upload_form.html', {'title': title, 'form': form})

案例:混合数据(ModelForm)

models.py
class City(models.Model):
    """ 老板 """
    name = models.CharField(max_length=32, verbose_name='名称')
    count = models.IntegerField(verbose_name='人口')

    # 本质上数据库也是ChartField,自动保存数据。
    img = models.FileField(max_length=128, verbose_name='Logo', upload_to='city/')
定义ModelForm
from app01.utils.bootstrap import BootStrapForm, BootStrapModelForm

class UpModelForm(BootStrapModelForm):
    bootstrap_exclude_fields = ['img']

    class Meta:
        model = models.City
        fields = '__all__'
视图
def upload_modal_form(request):
    """ 上传文件和数据(ModalForm)"""
    title = "ModelForm上传文件"
    if request.method == 'GET':
        form = UpModelForm()
        return render(request, 'upload_form.html', {'form': form, 'title': title})

    form = UpModelForm(data=request.POST, files=request.FILES)
    if form.is_valid():
        # 对于文件:自动保存
        # 字段 + 上传路径写入到数据库
        form.save()
        return HttpResponse("成功")
    return render(request, 'upload_form.html', {'form': form, 'title': title})

小结

  • 自己手动去写

    file_object = request.FILES.get("exc")
    ...
    
  • Form组件(表单验证)

    request.POST
    file_object = request.FILES.get("exc")
    
    具体文件操作还是手动自己做。
    
  • ModelForm(表单验证+自动保存数据库+自动保存文件)

    - Media文件夹
    - Models.py定义类文件要
    	img = models.FileField(verbose_name="Logo", max_length=128, upload_to='city/')
    

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1576481.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何理解图像处理领域的病态问题(ill-posed problem)

ill-posed problem&#xff0c;我们可以理解为病态问题或者不适定问题。在本文中&#xff0c;统一成为不适定问题。 在讨论不适定问题&#xff08;ill-posed problem&#xff09;之前&#xff0c;我们先来看一下什么叫适定性问题&#xff08;well-posed problem&#xff09;。…

计算机视觉——基于深度学习检测监控视频发生异常事件的算法实现

1. 简介 视频异常检测&#xff08;VAD&#xff09;是一门旨在自动化监控视频分析的技术&#xff0c;其核心目标是利用计算机视觉系统来监测监控摄像头的画面&#xff0c;并自动检测其中的异常或非常规活动。随着监控摄像头在各种场合的广泛应用&#xff0c;人工监视已经变得不…

SAP HCM PT 2003修改班次,PP61无法自动更新

今天遇到一个问题&#xff0c;2003修改班次以后PP61无法自动更新&#xff0c;开始一直以为是什么配置点漏掉&#xff0c;但是发现开发机没问题&#xff0c;后来发现是用户选保存的时候选中目标计划的完成&#xff0c;这个是保存到实际计划的&#xff0c;数据存储psoll中&#x…

【引子】C++从介绍到HelloWorld

C从介绍到HelloWorld 一、C的介绍1. 简介2. 应用场景3. C的标准![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e3efb0f207f647729b92c0b5bcd4b330.png)4. C的运行过程 二、Visual Studio的安装1. 什么是Visual Studio2. Visual Studio的安装 三、完成HelloWorld1.…

Redis 之集群模式

一 集群原理 集群&#xff0c;即Redis Cluster&#xff0c;是Redis 3.0开始引入的分布式存储方案。 集群由多个节点(Node)组成&#xff0c;Redis的数据分布在这些节点中。 集群中的节点分为主节点和从节点&#xff1a;只有主节点负责读写请求和集群信息的维护&#xff1b;从…

51单片机之串口通信

目录 1.串口简介 1.1TXD和RXD 1.2通讯接口 1.3通信方式 1.4 51单片机的UART模式 2.串口配置 2.1寄存器简介 SCON寄存器配置 PCON配置 2.2代码配置串口 2.2.1 配置串口发送数据 2.2.2配置电脑向单片机发送数据点亮LED 1.串口简介 串口是一个应用十分广泛的通讯接口&am…

【Java集合进阶】LinkedList和迭代器的源码分析泛型类、泛型方法、泛型接口

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

项目架构MVC,DDD学习

写在前面 本文一起看下项目架构DDD&#xff0c;MVC相关的内容。 1&#xff1a;MVC 不管我们做什么项目&#xff0c;自己想想其实只是做了三件事&#xff0c;如下&#xff1a; 其实&#xff0c;这三件事完全在一个类中做完也可以可以正常把项目完成的&#xff0c;就像下面这…

MySQL-主从复制:概述、原理、同步数据一致性问题、搭建流程

主从复制 1. 主从复制概述 1.1 如何提升数据库并发能力 一般应用对数据库而言都是“读多写少”&#xff0c;也就说对数据库读取数据的压力比较大&#xff0c;有一个思路就是采用数据库集群的方案&#xff0c;做主从架构、进行读写分离&#xff0c;这样同样可以提升数据库的并…

mysql结构与sql执行流程

Mysql的大体结构 客户端&#xff1a;用于链接mysql的软件 连接池&#xff1a; sql接口&#xff1a; 查询解析器&#xff1a; MySQL连接层 连接层&#xff1a; 应用程序通过接口&#xff08;如odbc,jdbc&#xff09;来连接mysql&#xff0c;最先连接处理的是连接层。 连接层…

【Linux】达梦数据库安装部署(附详细图文)

目录 一、安装前的准备工作 1.检查操作系统配置 &#xff08;1&#xff09;获取系统位数 getconf LONG_BIT &#xff08;2&#xff09;查看操作系统release信息 cat /etc/system-release &#xff08;3&#xff09;查询系统名称 uname -a &#xff08;4&#xff09;查看操…

基于Spring Boot的网上书城系统(带文档)

主要功能 本次设计任务是要设计一个网上书城管理系统&#xff0c;通过这个系统能够满足网上书城的管理及用户的图书信息管理及购物功能。系统的主要功能包括&#xff1a;首页、个人中心、用户管理、图书类型管理、图书分类管理、图书信息管理、我的收藏管理、系统管理、订单管…

websocket实践

文章目录 背景WebSocket API使用场景优点 实例步骤 1: 设置 WebSocket 服务器步骤 2: 创建客户端 HTML 页面步骤 3: 测试 WebSocket 通信注意事项实际操作 参考资料 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它使得浏览器和服务器只需建立一个连接&#xff0c;…

SWM341系列应用(MPU屏应用)

SWM341系列 MPU屏应用 1、MPU屏写入时序设置&#xff08;设置单位为周期&#xff09;&#xff0c;根据ST7789规格书规定的最小时序要求&#xff0c;建议MPU屏时序按照ST7789手册配置,建议配置的参数注释。例如WRRise_CSRise&#xff0c;时序图要求是最低10ns&#xff0c;根据计…

1.8.3 卷积神经网络近年来在结构设计上的主要发展和变迁——GoogleNet/inception-v1

1.8.3 卷积神经网络近年来在结构设计上的主要发展和变迁——GoogleNet/ inception-v1 前情回顾&#xff1a; 1.8.1 卷积神经网络近年来在结构设计上的主要发展和变迁——AlexNet 1.8.2 卷积神经网络近年来在结构设计上的主要发展和变迁——VGGNet GoogleNet问题 在VGGNet简单堆…

分类预测 | Matlab实现ABC-LSSVM人工蜂群算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现ABC-LSSVM人工蜂群算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现ABC-LSSVM人工蜂群算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现ABC-LSSVM人工蜂群算法优化最小二乘支…

Redis中的Sentinel(六)

Sentinel 选举领头Sentinel. 当一个主服务器被判断为客观下线时&#xff0c;监视这个下线主服务器的各个Sentinel会进行协商&#xff0c;选举出一个领头Sentinel,并由领头 Sentinel对下线主服务器执行故障转移操作。以下是Redis选举领头Sentinel的规则和方法: 1.所有在线的S…

LabVIEW厂房漏水检测监控系统

LabVIEW厂房漏水检测监控系统 随着信息技术和智能制造的快速发展&#xff0c;对于精密仪器和重要物品存放场所的环境监控日益重要&#xff0c;特别是防止漏水带来的潜在风险。漏水不仅可能导致珍贵资料或仪器的损坏&#xff0c;还可能引发安全事故&#xff0c;给企业和研究机构…

在 C++ 中轻松实现字符串与字符数组的相互转换

在 C 中轻松实现字符串与字符数组的相互转换 引言一、将字符串转换为 char 数组1.1、C 中的 c_str()和 strcpy()函数1.2、使用 for 循环中的字符串到字符数组的转换 二、将 char 数组转换为字符串2.1、C 运算符 2.2、C 重载 运算符2.3、C 字符串内置构造函数 三、总结 引言 本…

阿里云服务器可以干嘛 阿里云服务器应用场景有哪些

阿里云服务器可以干嘛&#xff1f;能干啥你还不知道么&#xff01;简单来讲可用来搭建网站、个人博客、企业官网、论坛、电子商务、AI、LLM大语言模型、测试环境等&#xff0c;阿里云百科aliyunbaike.com整理阿里云服务器的用途&#xff1a; 阿里云服务器活动 aliyunbaike.com…