python web练习案例:基于表单类的商品管理(修改并删除商品信息)

目录

1、修改商品信息

(1)修改show.html页面,增加 修改 栏

(2)创建 update.html 网页,继承 add.html 模板

 (3)定义视图函数

(4)定义路由

 (5) 浏览器查看 修改商品信息功能实现

 2、删除商品

(1)修改 show.html 网页,增加 删除 栏 

(2)定义视图函数,实现删除商品的逻辑 

(3)定义路由 

源代码


1、修改商品信息

在上个基础上(实现了商品展示和添加功能)继续

(1)修改show.html页面,增加 修改 栏

(2)创建 update.html 网页,继承 add.html 模板

继承之前需要对add 添加一些 block标签

 add.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    {% block title %}
    <title>添加商品信息</title>
    {% endblock %}
</head>
<body>
{% block h1 %}
<h1>添加商品信息</h1>
{% endblock %}
<form method="post" novalidate>
    {% csrf_token %}
    {{ form.as_p }}
    {% block input %}
    <input type="submit" value="添加商品信息">
    {% endblock %}
</form>
</body>
</html>

 创建 update.html

<!-- 因为添加商品信息和修改商品信息的页面结构类似,因此可以使用模版继承 -->
{% extends 'add.html' %}
    {% block title %}
    <title>修改商品信息</title>
    {% endblock %}

<body>
{% block h1 %}
<h1>修改商品信息</h1>
{% endblock %}

{% block input %}
    <input type="submit" value="修改商品信息">
    {% endblock %}

 (3)定义视图函数

def update_goods(request,gid):
    """修改商品信息"""
    # 根据传递过来的gid去数据库中获取对应的记录
    # good = Goods.objects.get(id=gid)
    good = Goods.objects.filter(id=gid).first()
    print(good)
    if request.method == 'GET':
        form = GoodsForm(instance=good)   # instance=good 把获取到的当前 good对象显示在表单中
        return render(request,'update.html',{'form':form})
    else:
        form = GoodsForm(request.POST,instance=good)  # instance=good参数,如果没有这个参数则是添加效果,有了这个参数才是修改效果
        if form.is_valid():
            try:
                form.save()
            except Exception as e:
                return HttpResponseForbidden(f'修改商品失败,错误原因:{e}')
            return redirect('/')  # 页面重定向到展示商品信息的页面
        return render(request, 'update.html', {'form': form})

(4)定义路由

 path('update/<int:gid>/',views.update_goods),

 (5) 浏览器查看 修改商品信息功能实现

 2、删除商品

(1)修改 show.html 网页,增加 删除 栏 

(2)定义视图函数,实现删除商品的逻辑 

(3)定义路由 


源代码

show.html完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>商品信息</title>
</head>
<body>
<h3>下面将通过表格的形式展示商品信息</h3>
<!-- table表格  tr 行 th 表头 标题  td 数据-->
<table border="1">
    <tr>
        <th>商品ID</th>
        <th>商品名称</th>
        <th>商品价格</th>
        <th>商品库存</th>
        <th>商品销量</th>
        <th>修改商品信息</th>
         <th>删除信息</th>
    </tr>
    {% for good in goods %}
    <tr>
        <td>{{ good.id }}</td>
        <td>{{ good.name }}</td>
        <td>{{ good.price }}</td>
        <td>{{ good.stock }}</td>
        <td>{{ good.sales }}</td>
        <td align="center">
            <a href="/update/{{ good.id }}">修改</a>
        </td>
        <td align="center">
            <a href="/delete/{{ good.id }}">删除</a>
        </td>
    </tr>
    {% endfor %}
</table>
<div>
    <a href="/add/">添加商品信息</a>
</div>
</body>
</html>

add.html完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    {% block title %}
    <title>添加商品信息</title>
    {% endblock %}
</head>
<body>
{% block h1 %}
<h1>添加商品信息</h1>
{% endblock %}
    <form method="post" novalidate>
        {% csrf_token %}
        {{ form.as_p }}
        {% block input %}
        <input type="submit" value="确定添加">
        {% endblock %}
    </form>
</body>
</html>

update.html完整代码

<!-- 页面结构类似,可以使用模板继承  注意 %} 不能有空格-->
{% extends 'add.html' %}
   {% block title %}
    <title>修改商品信息</title>
    {% endblock %}
    {% block h1 %}
    <h1>修改商品信息</h1>
    {% endblock %}
    {% block input %}
    <input type="submit" value="确定修改">
    {% endblock %}

views.py完整代码

from django.http import HttpResponse, HttpResponseForbidden
from django.shortcuts import render, redirect
from .models import Goods

def show_goods(request):
    """显示商品信息"""
    # 从数据库中查询所有的数据 all 查找所有信息  filter匹配某个条件  exclude 排除符合某个条件的信息
    all_goods = Goods.objects.all()
    print(all_goods)  # 输出查询到的数据
    # return HttpResponse('查询到信息了')
    return render(request,'show.html',{'goods':all_goods})

from .forms import GoodsForm
def add_goods(request):
    """添加商品信息"""
    if request.method == 'GET':
        form = GoodsForm()  # 实例化空表单
        return render(request,'add.html',{'form':form})
    else:
        form = GoodsForm(request.POST)  # 获取表单数据并实例化表单
        good = Goods()  # 实例化一个商品对象,用于存放表单数据
        if form.is_valid():
            good.name = form.cleaned_data['name']  # 取出验证过的数据
            good.price = form.cleaned_data['price']
            good.stock = form.cleaned_data['stock']
            good.sales = form.cleaned_data['sales']
            try:
                good.save()  # 把数据写入数据库
            except Exception as e:
                return HttpResponseForbidden(f'数据错误,添加失败,原因:{e}')
            return redirect('/')  # 页面重定向
        return render(request,'add.html',{'form':form})  # forms携带错误信息的

def update_goods(request,gid):
    """修改商品信息"""
    # 根据传递过来的gid去数据库中获取对应的记录
    # good = Goods.objects.get(id=gid)
    good = Goods.objects.filter(id=gid).first()
    print(good)
    if request.method == 'GET':
        form = GoodsForm(instance=good)   # instance=good 把获取到的当前 good对象显示在表单中
        return render(request,'update.html',{'form':form})
    else:
        form = GoodsForm(request.POST,instance=good)  # instance=good参数,如果没有这个参数则是添加效果,有了这个参数才是修改效果
        if form.is_valid():
            try:
                form.save()
            except Exception as e:
                return HttpResponseForbidden(f'修改商品失败,错误原因:{e}')
            return redirect('/')  # 页面重定向到展示商品信息的页面
        return render(request, 'update.html', {'form': form})

def delete_goods(request,gid):
    """删除商品信息"""
    # 根据gid去数据库拿到对应的记录
    good = Goods.objects.filter(id=gid).first()
    try:
        good.delete()  # 删除记录
    except Exception as e:
        return HttpResponseForbidden(f'删除失败,错误原因:{e}')
    return redirect('/')

app1/urls.py完整代码


from django.urls import path
from . import views
urlpatterns = [
    path('', views.show_goods),
    path('add/',views.add_goods),    
    path('update/<int:gid>/',views.update_goods),
    path('delete/<int:gid>/',views.delete_goods)
]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【容器】k8s学习笔记基础部分(三万字超详细)

概念 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点&#xff1a;不能为应用程序定义资源使…

数据结构速成

1. 数据结构与算法 2. 顺序表 3. 链表 4. 栈与队列 5. 串 6. 树与二叉树&#xff08;1&#xff09; 7. 树与二叉树&#xff08;2&#xff09; 8. 图 9. 图的应用 10. 查找 11. 排序&#xff08;1&#xff09; 12. 排序&#xff08;2&#xff09;

算法题(5):求和

审题&#xff1a; 首先我们需要对这个式子先整理一下。 整理后可以知道 我们发现ai乘的那一串数字逐渐减少&#xff0c;而每次减少的就是ai。 思路&#xff1a; 获取数据&#xff1a;用n获取数据个数-》确定获取数据的循环次数 用数组a存储数据 用sum获录入数据之和 用num存储最…

el-table 动态计算合并行

原始表格及代码 <el-table:data"tableData"class"myTable"header-row-class-name"tableHead" ><el-table-column prop"date" label"日期"> </el-table-column><el-table-column prop"name" …

深圳国威HB1910数字IP程控交换机 generate.php 远程命令执行漏洞复现

0x01 产品描述: 深圳国威主营国威模拟、数字、IP 交换机、语音网关、IP 电话机及各种电话机。深圳国威电子有限公司HB1910是一款功能强大的网络通信设备,适用于各种企业通信需求。 0x02 漏洞描述: 深圳国威电子有限公司HB1910数字IP程控交换机generate.php存在远程命令执行…

数据结构(链表)JAVA方法的介绍

注意&#xff1a; 1.我们从上图中可以看出链表LinkedList继承于List接口&#xff1a; 如果不懂List接口的朋友们可以先看我上期作品了解一下List接口 数据结构&#xff08;顺序表&#xff09;JAVA方法的介绍-CSDN博客 2.本期注重讲解Java中LinkedList链表中个方法的使用&am…

UE5中实现Billboard公告板渲染

公告板&#xff08;Billboard&#xff09;通常指永远面向摄像机的面片&#xff0c;游戏中许多技术都基于公告板&#xff0c;例如提示拾取图标、敌人血槽信息等&#xff0c;本文将使用UE5和材质节点制作一个公告板。 Gif效果&#xff1a; 网格效果&#xff1a; 1.思路 通过…

文件包含 0 1学习

漏洞原理 成因 文件包含漏洞是一个最常见的依赖与脚本运行而影响Web应用程序的漏洞.当应用程序使用攻击者控制的变量建立一个可执行代码的路径,允许攻击者控制在运行时执行哪个文件时,就会导致文件包含漏洞.程序开发人员通常会把可重复使用的函数写入单文件中,在使用这些函数…

docker login 出错 Error response from daemon

在自己的Linux服务器尝试登陆docker出错 输入完用户密码之后错误如下&#xff1a; 解决方案 1.打开daemo文件&#xff1a; vim/etc/docker/daemon.json 2.常用的国内Docker 镜像源地址 网易云 Docker 镜像&#xff1a;http://hub-mirror.c.163.com 百度云 Docker 镜像&#x…

专业140+总分410+浙江大学842信号系统与数字电路考研经验浙大电子信息与通信工程,真题,大纲,参考书。

考研落幕&#xff0c;本人本中游211&#xff0c;如愿以偿考入浙江大学&#xff0c;专业课842信号系统与数字电路140&#xff0c;总分410&#xff0c;和考前多次模考预期差距不大&#xff08;建议大家平时做好定期模考测试&#xff0c;直接从实战分数中&#xff0c;找到复习的脉…

【html网页页面012】html+css制作品牌主题宏宝莱网页含视频、留言表单(7页面附效果及源码)

品牌主题宏宝莱网页制作 &#x1f964;1、写在前面&#x1f367;2、涉及知识&#x1f333;3、网页效果完整效果(7页)&#xff1a;代码目录结构&#xff1a;page1、首页page2、衍生品page3、包装设计page4、视频介绍page5、留言板page6、联系我们page7、详情页&#xff08;三层页…

Unity 获取鼠标点击位置物体贴图颜色

实现 Ray ray Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit)) {textureCoord hit.textureCoord;textureCoord.x * textureMat.width;textureCoord.y * textureMat.height;textureColor textureMat.GetPixel(Mathf.Flo…

游戏引擎学习第50天

仓库: https://gitee.com/mrxiao_com/2d_game Minkowski 这个算法有点懵逼 回顾 基本上&#xff0c;现在我们所处的阶段是&#xff0c;回顾最初的代码&#xff0c;我们正在讨论我们希望在引擎中实现的所有功能。我们正在做的版本是初步的、粗略的版本&#xff0c;涵盖我们认…

Mac备忘录表格中换行(`Option` + `Return`(回车键))

在Mac的ARM架构设备上&#xff0c;如果你使用的是Apple的原生“备忘录”应用来创建表格&#xff0c;换行操作可以通过以下步骤来实现&#xff1a; 在单元格中换行&#xff1a; 双击你想要编辑的单元格你可以输入文本&#xff0c;按Option&#xff08;⌥&#xff09; Enter来插…

蜂鸟视图微程序:低代码赋能室内导航应用开发

随着数字化转型的深入&#xff0c;室内导航应用的需求日益增加。然而&#xff0c;传统的开发模式往往成本高、周期长、门槛高&#xff0c;给企业带来诸多挑战。 蜂鸟视图微程序应运而生&#xff0c;通过低代码技术赋能开发者&#xff0c;快速构建高性能室内地图导航应用&#…

#渗透测试#漏洞挖掘#红蓝攻防#SRC漏洞挖掘

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

http 502 和 504 的区别

首先看一下概念&#xff1a; 502&#xff1a;作为网关或者代理工作的服务器尝试执行请求时&#xff0c;从上游服务器接收到无效的响应。503&#xff1a;由于临时的服务器维护或者过载&#xff0c;服务器当前无法处理请求。这个状况是临时的&#xff0c;并且将在一段时间以后恢…

ES6 混合 ES5学习记录

基础 数组 let arr [数据1&#xff0c;数据2&#xff0c;...数组n] 使用数组 数组名[索引] 数组长度 arr.length 操作数组 arr.push() 尾部添加一个,返回新长度 arr.unshift() 头部添加一个,返回新长度 arr.pop() 删除最后一个,并返回该元素的值 shift 删除第一个单元…

编写php项目所需环境

需要编写php项目&#xff0c;需要看到编写的代码展现的效果&#xff0c;这里我选择用xampp来展现 准备工作&#xff1a; https://learncodingfast.com/how-to-install-xampp-and-brackets/#Installing_and_Running_XAMPP xampp下载地址&#xff1a;https://www.apachefriends.…

吉林大学机器学习复习

第一章、绪论&#xff1a; 相关概念&#xff1a; 训练集&#xff1b;评估函数&#xff08;目标函数、代价函数&#xff09;&#xff1b;梯度下降&#xff1b;机器学习算法的分类 机器学习是什么&#xff1a;寻找一个函数&#xff08;模型&#xff09;。 机器学习的基本流程&…