七、Ajax(Django开发)

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 modelsclass Admin(models.Model):""" 管理员 """username = models.CharField(max_length=32, verbose_name='用户名')password = models.CharField(max_length=64, verbose_name='密码')def __str__(self):return self.usernameclass 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, renderdef 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].valueexists = 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 modelsdef 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 servere_path(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}, name='media'),

在settings.py中进行配置:

import osMEDIA_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 settingsdef 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, BootStrapModelFormclass UpModelForm(BootStrapModelForm):bootstrap_exclude_fields = ['img']class Meta:model = models.Cityfields = '__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.mzph.cn/news/799684.shtml

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

相关文章

C++设计模式:桥模式(五)

1、定义与动机 桥模式定义&#xff1a;将抽象部分&#xff08;业务功能&#xff09;与实现部分&#xff08;平台实现&#xff09;分离&#xff0c;使他们可以独立地变化引入动机&#xff1a; 由于某些类型的固有的实现逻辑&#xff0c;使得它们具有两个变化的维度&#xff0c;…

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

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

单例模式--理解

单例模式 单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时&#xff0c;为了防止频繁地创建对象使得内存飙升&#xff0c;单例模式可以让程序仅在内存中创建一个对象&#xff0c;让所有需要调用的地方都共享这一单例对象。 单…

使用docker-compose创建多项目容器运行

使用docker-compose创建多项目容器运行 按招网友提供方法创建 docker-compose.yml内容&#xff08;这里改了桥接模式&#xff0c;并且注释放开&#xff09; version: "3" services:docker_python:image: python:2.7.18container_name: py_appworking_dir: "/r…

婴儿洗衣机哪种比较实用?精选四大热门口碑婴儿洗衣机推荐

对于有了宝宝的家庭来说&#xff0c;洗衣成为了一项重要的家务事。大家都知道&#xff0c;宝宝的皮肤比较娇嫩&#xff0c;容易受到各种细菌、病毒的侵扰。所以&#xff0c;宝宝的衣物应该与大人的分开洗。婴儿洗衣机作为一种专门为婴幼儿家庭设计的洗衣机&#xff0c;其具有除…

nginx部署前端教程

目录 一、前言二、部署三、注意四、参考 一、前言 一般来说现在的软件项目&#xff0c;都是分用户端以及管理端的&#xff0c;并且是前后端分离的&#xff0c;这里我来记录一下部署两个前端的教程。 部署前端之前需要的准备工作是部署springBoot后端程序&#xff0c;这里我do…

qt设置异形图片并实现透明效果

思路:将背景设置为透明,然后将图片设置给label,将laben和this都设置为图片大小 setAttribute(Qt::WA_TranslucentBackground, true); 可以将背景设置为透明 然后 QPixmap *pixnew QPixmap(":/Image/xxx.png"); this->setFixedSize(pix->width(),pix->…

对OceanBase中的配置项与系统变量,合法性检查实践

在“OceanBase 配置项&系统变量实现及应用详解”的系列文章中&#xff0c;我们已经对配置项和系统变量的源码进行了解析。当涉及到新增配置项或系统变量时&#xff0c;通常会为其指定一个明确的取值范围或定义一个专门的合法性检查函数。本文将详细阐述在不同情境下&#x…

深入理解指针2:数组名理解、一维数组传参本质、二级指针、指针数组和数组指针、函数中指针变量

目录 1、数组名理解 2、一维数组传参本质 3、二级指针 4、指针数组和数组指针 5、函数指针变量 1、数组名理解 首先来看一段代码&#xff1a; int main() {int arr[10] { 1,2,3,4,5,6,7,8,9,10 };printf("%d\n", sizeof(arr));return 0; } 输出的结果是&…

[大模型]大语言模型量化方法对比:GPTQ、GGUF、AWQ

在过去的一年里&#xff0c;大型语言模型(llm)有了飞速的发展&#xff0c;在本文中&#xff0c;我们将探讨几种(量化)的方式&#xff0c;除此以外&#xff0c;还会介绍分片及不同的保存和压缩策略。 说明&#xff1a;每次加载LLM示例后&#xff0c;建议清除缓存&#xff0c;以…

python之列表操作

1、创建列表 代码示例&#xff1a; i [1, 2, 34, 4] o list((1, 2, 3, 4, 5, 6)) 分别创建了两个数组&#xff0c;这两种格式都能创建数组 2、关于数组的操作 1、添加元素 1、append&#xff08;&#xff09; append方法主要是添加一个元素 代码示例如下&#xff1a;…

深度学习理论基础(七)Transformer编码器和解码器

学习目录&#xff1a; 深度学习理论基础&#xff08;一&#xff09;Python及Torch基础篇 深度学习理论基础&#xff08;二&#xff09;深度神经网络DNN 深度学习理论基础&#xff08;三&#xff09;封装数据集及手写数字识别 深度学习理论基础&#xff08;四&#xff09;Parse…

手机软件何时统一--桥接模式

1.1 凭什么你的游戏我不能玩 2007年苹果手机尚未出世&#xff0c;机操作系统多种多样&#xff08;黑莓、塞班、Tizen等&#xff09;&#xff0c;互相封闭。而如今&#xff0c;存世的手机操作系统只剩下苹果OS和安卓&#xff0c;鸿蒙正在稳步进场。 1.2 紧耦合的程序演化 手机…

vue的 blob文件下载文件时,后端自定义异常,并返回json错误提示信息,前端捕获信息并展示给用户

1.后端返回的json数据结构为&#xff1a; {"message":"下载失败&#xff0c;下载文件不存在&#xff0c;请联系管理员处理&#xff01;","code":500} 2.vue 请求后台接口返回的 Blob数据 3.问题出现的原因是&#xff0c;正常其他数据列表接口&…

[C++][算法基础]堆排序(堆)

输入一个长度为 n 的整数数列&#xff0c;从小到大输出前 m 小的数。 输入格式 第一行包含整数 n 和 m。 第二行包含 n 个整数&#xff0c;表示整数数列。 输出格式 共一行&#xff0c;包含 m 个整数&#xff0c;表示整数数列中前 m 小的数。 数据范围 1≤m≤n≤&#x…

第4章 Redis,一站式高性能存储方案,笔记问题

点赞具体要实现功能有哪些&#xff1f; 可以点赞的地方&#xff1a;对帖子点赞&#xff0c;对评论点赞点一次是点赞&#xff0c;再点一次是取消赞统计点赞的数量&#xff08;计数&#xff0c;string&#xff09;&#xff0c;帖子被点赞的数量&#xff0c;某个用户被点赞的数量…

【数据结构】考研真题攻克与重点知识点剖析 - 第 5 篇:树与二叉树

&#xff08;考研真题待更新&#xff09; 欢迎订阅专栏&#xff1a;408直通车 请注意&#xff0c;本文中的部分内容来自网络搜集和个人实践&#xff0c;如有任何错误&#xff0c;请随时向我们提出批评和指正。本文仅供学习和交流使用&#xff0c;不涉及任何商业目的。如果因本…

2024免费Mac电脑用户的系统清理和优化软件CleanMyMac

作为产品营销专家&#xff0c;对于各类产品的特性与优势有着深入的了解。CleanMyMac是一款针对Mac电脑用户的系统清理和优化软件&#xff0c;旨在帮助用户轻松管理、优化和保护Mac电脑。以下是关于CleanMyMac的详细介绍&#xff1a; CleanMyMac X2024全新版下载如下: https://…

阿里云乱扣费故障,技术堪忧

2024年4月3日&#xff0c;距离2023年11月的故障没有多久&#xff0c;阿里云又出现乱扣费故障&#xff0c;导致账号欠费3000多&#xff0c;oss&#xff0c;块存储&#xff0c;cdn等所有后付费服务停止工作&#xff0c;不知道这个故障能算什么级别的。 凌晨1点多&#xff0c;收到…

用Vue全家桶手工搓了一个类似抖音短视频的软件,全开源

用Vue全家桶手工搓了一个类似抖音短视频的软件&#xff0c;全开源 软件简介 用Vue全家桶手工搓了一个高仿抖音&#xff0c;全开源 PC浏览器请用手机模式访问。先按F12调出控制台&#xff0c;再按CtrlShiftM切换到手机模式&#xff0c;手机请用Via浏览器或者Chrome浏览器预览。…