增删改查。配置对应路由,函数,视图。报错注意看控制台。

添加取到前台传来的参数,后端给予验证。入库

编辑,取到当前编辑得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增删改查的更多相关文章

  1. django 增删改查操作 数据库Mysql

    下面介绍一下django增删改查操作: 1.view.py # -*- coding: utf-8 -*-from __future__ import unicode_literalsfrom dja ...

  2. Django 自带的ORM增删改查

     通过Django来对数据库进行增删改查 1 首先创建类,在app应用程序里面的model模块里面创建类,写好数据库信息,方便我们待会初始化: 2 创建在django项目里面的settings里面添加 ...

  3. Django数据库操作(增删改查)

    Django数据库操作(增删改查) 创建数据库中的一个表 class Business(models.Model): #自动创建ID列 caption = models.CharField(max_l ...

  4. Django中ORM表的创建以及基本增删改查

    Django作为重量级的Python web框架,在做项目时肯定少不了与数据库打交道,编程人员对数据库的语法简单的还行,但过多的数据库语句不是编程人员的重点对象.因此用ORM来操作数据库相当快捷.今天 ...

  5. 饮冰三年-人工智能-Python-24 Django ORM增删改查

    一:首先使用默认的sqlite3创建表 1:现在在models.py中添加表模型 from django.db import models # Create your models here. cla ...

  6. $Django orm增删改字段、建表 ,单表增删改查,Django请求生命周期

    1 orm介绍  ORM是什么   ORM 是 python编程语言后端web框架 Django的核心思想,“Object Relational Mapping”,即对象-关系映射,简称ORM.  一 ...

  7. python的Web框架,Django的ORM,模型基础,MySQL连接配置及增删改查

    Django中的ORM简介 ORM概念:对象关系映射(Object Relational Mapping,简称ORM): 用面向对象的方式描述数据库,去操作数据库,甚至可以达到不用编写SQL语句就能够 ...

  8. Django之数据表增删改查

    Django数据增删改查: 上课代码 from django.shortcuts import render,HttpResponse # Create your views here. from a ...

  9. Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查

    一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process ...

  10. django ORM 增删改查 模糊查询 字段类型 及参数等

    ORM 相关 #sql中的表 #创建表: CREATE TABLE employee( id INT PRIMARY KEY auto_increment , name VARCHAR (), gen ...

随机推荐

  1. Util应用框架基础(五) - 异常处理

    本节介绍Util应用框架如何处理系统错误. 概述 系统在运行过程中可能发生错误. 系统错误可以简单分为两类: 系统异常 系统本身出现的错误. 业务异常 不满足业务规则出现的错误. 如何处理系统异常 如 ...

  2. Avalonia 实现跨平台的IM即时通讯、语音视频通话(源码,支持信创国产OS,统信、银河麒麟)

    在 Avalonia 如火如荼的现在,之前使用CPF实现的简单IM,非常有必要基于 Avalonia 来实现了.Avalonia 在跨平台上的表现非常出色,对信创国产操作系统(像银河麒麟.统信UOS. ...

  3. 【Javaweb】做一个房产信息管理系统二

    由于我还不太熟练用sql语句写数据库,所以直接用navicate了 我们需要新建四个数据表: adimin(超级管理员信息) customer(顾客) property(房产信息) realestat ...

  4. extern关键字的用法

    extern关键字的理解 extern是C/C++语言中的一个关键字,用于声明一个变量或函数具有外部链接性(external linkage),即这些变量或函数可以被其他文件访问. 在C/C++中,如 ...

  5. Optional源码分析(涉及Objects源码和Stream源码)

    研究Optional源码之前先谈一谈Objects源码. 主要代码: @ForceInline public static <T> T requireNonNull(T obj) { if ...

  6. Head First Java学习:第八章-接口和抽象类

    第八章:接口和抽象类 深入多态 1.抽象类:有些类不应该被初始化 在类声明前面加上抽象类的关键字,abstract. 防止类被初始化,即不能被"new"创建该类的实例(要求) 还是 ...

  7. vmware虚拟机 linux 本地yum源,网卡配置ens33,防火墙selinux

    1.挂载镜像文件,CentOS-7-x86_64-DVD-1804.iso,并且要处于连接状态 #光盘挂载至/mntmount /dev/sr0 /mnt #备份yum源文件cd /etc/yum.r ...

  8. Cesium被接入数字孪生系统后会发生怎样的改变?

    众所周知,Cesium凭借其开源免费的特点一直垄断着整个三维GIS的生态系统,但是随着数字孪生技术的发展以及各项新需求的不断涌现,Cesium与数字孪生系统相结合的潜力也逐渐凸显. 一般而言,Cesi ...

  9. 【云原生 | Kubernetes 系列】—K8S部署RocketMQ集群(双主双从+同步模式)

    [云原生 | Kubernetes 系列]-K8S部署RocketMQ集群(双主双从+同步模式) 版权 本文为云录原创文章,转载无需和我联系,但请注明来自云录 https://www.yunzhuan ...

  10. Go 语言为什么很少使用数组?

    大家好,我是 frank,「Golang 语言开发栈」公众号作者. 01 介绍 在 Go 语言中,数组是一块连续的内存,数组不可以扩容,数组在作为参数传递时,属于值传递. 数组的长度和类型共同决定数组 ...