Django增删改查
增删改查。配置对应路由,函数,视图。报错注意看控制台。
添加取到前台传来的参数,后端给予验证。入库
编辑,取到当前编辑得id,在后台查到对应数据。重新update
删除,取到当前点击ID,后台delete
添加
views.py
#添加数据
class Index(APIView):
def get(self, request):
return render(request,'addgoods.html')
#POST接受添加数据
def post(self,request):
mes={}
name = request.data.get('name')
price = request.data.get('price')
img = request.FILES.get('img')
# print(name,price,img)
if not all([name,price,img]):
mes['code'] = 250
mes['message'] = '全要输入~'
else:
#写入图片
img_name = img.name
f = open(os.path.join(settings.UPLOAD_FILE, img_name), 'wb')
for i in img.chunks():
f.write(i)
f.close()
# 添加图库
goods = Goods(name=name, price=price, img='/upload/' + img_name)
goods.save()
mes['code'] = 200
mes['message'] = '添加成功'
# goods = Goods.objects.all()
# print(goods)
return redirect('/api/goods')
return render(request,'index.html',locals())
addgoods.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加商品</title>
</head>
<body>
<form method="post" enctype="multipart/form-data">
名称: <input type="text" name='name' value="" width=100><br>
价格: <input type="text" name='price' value="" width=100><br>
图片: <input type="file" name='img' value="" width=100><br>
确定: <input type="submit" value="确定">
</form>
</body>
</html>
删除
view.py
# 删除商品
class Pop_goods(APIView):
# get获取数据删除
def get(self,request):
mes={}
id = request.GET.get('id')
# print(id)
# 删除
try:
goods = Goods.objects.filter(id=id).delete()
except:
goods ={}
# 返回
mes['code']=200
mes['message']= '删除成功'
goods = Goods.objects.all()
return render(request, 'goodslist.html', locals())
del.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1">
<tr>
<th>序号</th>
<th>商品名称</th>
<th>价格</th>
<th>图片</th>
<th>删除</th>
<th>编辑</th>
<th>添加</th>
</tr>
{#使用for循环拿到当前页面上的所有数据对象(for循环中的c_page相当于c_page.object_list)#}
{% for i in c_page %}
<tr>
<td>{{i.id}}</td>
<td>{{i.name}}</td>
<td>{{i.price}}</td>
<td><img src="{{i.img}}" width="150" height="100"></td>
<td> <a href="/api/del/?id={{i.id}}" class="delete">删除</a></td>
<td> <a href="/api/edit/?id={{i.id}}" class="edit">修改</a></td>
<td><a href="/api/index/">添加</a></td>
</tr>
{% endfor %}
</table>
{# 要实现的效果#}
{# 上一页 1 2 3 下一页#}
{# 0、实现上一页 #}
{# 若有上一页,则拿到上一页的页码超链接 #}
{% if c_page.has_previous %}
<a href="/api/goods?page={{ c_page.previous_page_number }}">上一页</a>
{# 若没有上一页,则显示为普通的字符即可 #}
{% else %}
上一页
{% endif %}
{# 1、实现中间部分 #}
{#使用循环拿到每个页面#}
{% for p_num in paginator.page_range %}
{#若是当前页,则显示为普通的一个数字#}
{% if p_num == c_page_number %}
{{ p_num }}
{# 若不是当前页面,则显示为一个超链接 #}
{% else %}
<a href="/api/goods?page={{ p_num }}">{{ p_num }}</a>
{% endif %}
{% endfor %}
{# 2、实现下一页 #}
{# 若有下一页,则拿到下一页的页码超链接 #}
{% if c_page.has_next %}
<a href="/api/goods?page={{ c_page.next_page_number }}">下一页</a>
{# 若没有下一页,则显示为普通的字符即可 #}
{% else %}
下一页
{% endif %}
</body>
</html>
编辑
views.py
# 修改商品
class Change_goods(APIView):
def get(self,request):
id = request.GET.get('id')
goods = Goods.objects.filter(id=id)
return render(request, 'index.html', locals())
# 根据id获取数据
def post(self,request):
mes={}
id = request.GET.get('id')
print(id,'获取的编辑id')
name = request.data.get('name')
price = request.data.get('price')
img = request.FILES.get('img')
# print(id,name,price,img)
# 写入图片
img_name = img.name
f = open(os.path.join(settings.UPLOAD_FILE,img_name),'wb')
for i in img.chunks():
f.write(i)
f.close()
# 获取数据
goods = Goods.objects.filter(id=id).first()
goods.name=name
goods.price=price
goods.img='/upload/'+img_name
goods.save()
# 返回
mes['code']=200
mes['message']='修改成功'
return redirect('/api/goods')
edit.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>花满楼</h1>
<form method="post" enctype="multipart/form-data">
{% for i in goods %}
名称: <input type="text" name='name' value="{{i.name}}" width=100><br>
价格: <input type="text" name='price' value="{{i.price}}" width=100><br>
图片: <input type="file" name='img' value="" width=100><br>
确定: <input type="submit" value="确定">
{% endfor %}
</form>
{{mes}}
</body>
</html>
分页
views.py
from django.core.paginator import Paginator
#展示
class Goods_list(View):
def get(self, request):
page_num = request.GET.get('page', 1)
# all_data = ['a']
goods = Goods.objects.all()
# 1、初始化paginator
# 传入的参数(要分页的数据,每页要显示的数据条数)
paginator = Paginator(goods, 2)
# 2、初始化具体页码对应的page对象
c_page = paginator.page(int(page_num))
# 3、将值传入模板
return render(request, 'goodslist.html', locals())
fenye.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1">
<tr>
<th>序号</th>
<th>商品名称</th>
<th>价格</th>
<th>图片</th>
<th>删除</th>
<th>编辑</th>
<th>添加</th>
</tr>
{#使用for循环拿到当前页面上的所有数据对象(for循环中的c_page相当于c_page.object_list)#}
{% for i in c_page %}
<tr>
<td>{{i.id}}</td>
<td>{{i.name}}</td>
<td>{{i.price}}</td>
<td><img src="{{i.img}}" width="150" height="100"></td>
<td> <a href="/api/del/?id={{i.id}}" class="delete">删除</a></td>
<td> <a href="/api/edit/?id={{i.id}}" class="edit">修改</a></td>
<td><a href="/api/index/">添加</a></td>
</tr>
{% endfor %}
</table>
{# 要实现的效果#}
{# 上一页 1 2 3 下一页#}
{# 0、实现上一页 #}
{# 若有上一页,则拿到上一页的页码超链接 #}
{% if c_page.has_previous %}
<a href="/api/goods?page={{ c_page.previous_page_number }}">上一页</a>
{# 若没有上一页,则显示为普通的字符即可 #}
{% else %}
上一页
{% endif %}
{# 1、实现中间部分 #}
{#使用循环拿到每个页面#}
{% for p_num in paginator.page_range %}
{#若是当前页,则显示为普通的一个数字#}
{% if p_num == c_page_number %}
{{ p_num }}
{# 若不是当前页面,则显示为一个超链接 #}
{% else %}
<a href="/api/goods?page={{ p_num }}">{{ p_num }}</a>
{% endif %}
{% endfor %}
{# 2、实现下一页 #}
{# 若有下一页,则拿到下一页的页码超链接 #}
{% if c_page.has_next %}
<a href="/api/goods?page={{ c_page.next_page_number }}">下一页</a>
{# 若没有下一页,则显示为普通的字符即可 #}
{% else %}
下一页
{% endif %}
</body>
</html>
Django增删改查的更多相关文章
- django 增删改查操作 数据库Mysql
下面介绍一下django增删改查操作: 1.view.py # -*- coding: utf-8 -*-from __future__ import unicode_literalsfrom dja ...
- Django 自带的ORM增删改查
通过Django来对数据库进行增删改查 1 首先创建类,在app应用程序里面的model模块里面创建类,写好数据库信息,方便我们待会初始化: 2 创建在django项目里面的settings里面添加 ...
- Django数据库操作(增删改查)
Django数据库操作(增删改查) 创建数据库中的一个表 class Business(models.Model): #自动创建ID列 caption = models.CharField(max_l ...
- Django中ORM表的创建以及基本增删改查
Django作为重量级的Python web框架,在做项目时肯定少不了与数据库打交道,编程人员对数据库的语法简单的还行,但过多的数据库语句不是编程人员的重点对象.因此用ORM来操作数据库相当快捷.今天 ...
- 饮冰三年-人工智能-Python-24 Django ORM增删改查
一:首先使用默认的sqlite3创建表 1:现在在models.py中添加表模型 from django.db import models # Create your models here. cla ...
- $Django orm增删改字段、建表 ,单表增删改查,Django请求生命周期
1 orm介绍 ORM是什么 ORM 是 python编程语言后端web框架 Django的核心思想,“Object Relational Mapping”,即对象-关系映射,简称ORM. 一 ...
- python的Web框架,Django的ORM,模型基础,MySQL连接配置及增删改查
Django中的ORM简介 ORM概念:对象关系映射(Object Relational Mapping,简称ORM): 用面向对象的方式描述数据库,去操作数据库,甚至可以达到不用编写SQL语句就能够 ...
- Django之数据表增删改查
Django数据增删改查: 上课代码 from django.shortcuts import render,HttpResponse # Create your views here. from a ...
- Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查
一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process ...
- django ORM 增删改查 模糊查询 字段类型 及参数等
ORM 相关 #sql中的表 #创建表: CREATE TABLE employee( id INT PRIMARY KEY auto_increment , name VARCHAR (), gen ...
随机推荐
- off-line RL | CQL:魔改 Bellman error 更新,得到 Q 函数 lower-bound
论文题目: Conservative Q-Learning for Offline Reinforcement Learning CQL 是师兄盛赞的一篇论文:"是 off-line RL ...
- 国企项目就用国产的 Solon Java Framework,v2.5.12 发布
Solon 是什么框架? Java 新的生态级应用开发框架.国产.从零开始构建,有自己的标准规范与开放生态(历时五年,具备全球第二级别的生态规模).与其他框架相比,解决了两个重要的痛点:启动慢,费内存 ...
- python之史上最详细if教程
目录 简单的if语句 关系运算符 if-else语句 if-elif-else语句 使用多个elif代码块 省略else代码块 测试多个if 简单的if语句 if语句,顾名思义就是如果...那么就.. ...
- Django笔记四十三之使用uWSGI部署Django系统
本文首发于公众号:Hunter后端 原文链接:Django笔记四十三之使用uWSGI部署Django系统 目前部署 Django 的方式一般来说是使用 Nginx + uWSGI + Django 来 ...
- HTTP 和 HTTPS 之间除了安全性区别外,还有哪些区别
HTTP 和 HTTPS 是两种常见的网络协议,它们都是用于在浏览器和服务器之间传输数据的.但是,它们之间也有一些重要的区别,这些区别涉及到数据的安全性.传输性能.使用成本和搜索排名等方面.本文将从以 ...
- TS版LangChain实战:基于文档的增强检索(RAG)
LangChain LangChain是一个以 LLM (大语言模型)模型为核心的开发框架,LangChain的主要特性: 可以连接多种数据源,比如网页链接.本地PDF文件.向量数据库等 允许语言模型 ...
- HoG / SIFT 学习指北
本文 OI / ACM 无关. Explain HoG 原文出处: N. Dalal, and B. Triggs, Histograms of oriented gradients for huma ...
- Vite4+Typescript+Vue3+Pinia 从零搭建(6) - 状态管理pina
项目代码同步至码云 weiz-vue3-template pina 是 vue3 官方推荐的状态管理库,由 Vue 核心团队维护,旨在替代 vuex.pina 的更多介绍,可从 pina官网 查看 特 ...
- C语言所有运算符及优先级、结合性
C 语言所有运算符及优先级.结合性 参考:<C Primer Plus 第六版> Tip:有关优先级.结合性的表格在最后面. [1]算数运算符 '+'("加号")(二元 ...
- pta三次实验的总结
第一次pta作业 在pta第一次作业,因为是第一次作业所以大体是比较容易,但是也有几个要注意的点,就是两个double的值相加减相乘的值与实际值会有一定的误差,误差大小为0.0000001,所以在写p ...