从项目中学习Django 天天生鲜---------后台页面实现商品管理

成果图

商品类型界面

在这里插入图片描述
在这里插入图片描述

商品类型添加

在这里插入图片描述
在这里插入图片描述

商品类型修改

在这里插入图片描述

商品类型删除

在这里插入图片描述

商品界面

在这里插入图片描述

商品添加

在这里插入图片描述

商品修改

在这里插入图片描述

商品删除

在这里插入图片描述

项目步骤

建模

分析商品和商品类型与其他数据表之间的关系

  • 商品与商品类型
    一个商品类型可以有多个属于该类型的商品,所以商品类型与商品是一对多关系
  • 商品与店铺
    一个店铺可以有多个商品,不同的店铺有着相同的商品名但是意义不一样,因为在这个项目下每个商品都是属于自己的商家建立的而不是系统建立的,所以在这里是一对多

project01/models.py

......
#新加
# 商品类型
class GoodsType(models.Model):
    name = models.CharField(max_length=32)  # 类型名称
    logo = models.ImageField(upload_to='', default='1.jpg')  # 商品图片,用于前台显示

# 商品
class Goods(models.Model):
    name = models.CharField(max_length=32)  # 名称
    price = models.DecimalField(max_digits=5, decimal_places=2)
    # 价格 max_digits=5 总共5位,decimal_places=2 小数2位
    bzq = models.IntegerField()  # 保质期
    sczq = models.DateField(null=True, blank=True)  # 生产日期  null=True, blank=True 空
    image = models.ImageField(upload_to='goods', default='1.jpg')  # 商品图片
    desc = models.TextField()  # 商品描述
    # 设置外键 关系
    # 商品和类型之间的关系
    goodstype = models.ForeignKey(to=GoodsType, on_delete=models.CASCADE)
    # 商品和店铺的关系
    store = models.ForeignKey(to=Store, on_delete=models.CASCADE, null=True, blank=True)

python manage.py check
python manage.py makeimgrations
python manage.py imgrate

逻辑分析

  • 商品类型界面和商品界面都需要搭建路由,并分别传入当前用户的所有商品类型和商品
  • 商品类型和商品添加则需要先查看前台传入的数据是否有少,然后通过后台获取数据然后分别进行存储
  • 商品类型和商品的修改着需要先传入该商品的id来确认是那个商品或商品类型进行修改,当get请求时将该商品的数据展示到修改页面上以便修改,post和上面的添加类似
  • 商品类型和商品的删除,只需要传入需要删除的id即可

商品类型界面和商品界面

project01/views.py

#新加代码
#商品类型界面
@login_Decorator
def goods_type_list(request):
    # 获取当前用户下所有商品类型
    seller_id=request.COOKIES.get("seller_id")
    store=Store.objects.get(seller_id=seller_id)
    goodstype_obj_list=GoodsType.objects.filter(store_id=store.id).all()
    return  render(request,"seller/goods_type_list.html",locals())
#商品界面
@login_Decorator
def goods_list(request):
    # 查出当前卖家的所有的商品
    seller_id = request.COOKIES.get("seller_id")
    store_obj = Store.objects.get(seller_id=seller_id)
    # 根据店铺查询所有的商品
    # 注意:store_id 是django 给模型类添加的属性,需要赋值id
    goods_list_obj = Goods.objects.filter(store_id=store_obj.id)
    return render(request,"seller/goods_list.html",locals())

千万不要忘了配置路由
project01/urls.py

.....
urlpatterns = [
    path('', views.index),  # 后台首页
    path('index', views.index),  # 后台首页
    path('login', views.login),  # 登录
    path('register', views.register),  # 注册
    path('logout', views.logout),  # 登出
    path('store', views.store),  # 店铺页面
    #新加
    path('goods_type_list', views.goods_type_list),  # 商品类型页面
    path('goods_list', views.goods_list),  # 商品页面
	path('add_goods_type',views.add_goods_type), #添加商品类型页面
    path('add_goods',views.add_goods), #添加商品
    path('edit_goods_type',views.edit_goods_type), #编辑商品类型页面
    path('edit_goods',views.edit_goods), #修改商品
    path('del_goods_type',views.del_goods_type), #删除商品类型页面
    path('del_goods',views.del_goods), #删除商品
]

在这里插入图片描述
在这里插入图片描述

商品类型添加和商品添加

对于添加无疑先考虑前台会给后台传入那些数据

  • 商品类型
    这里点击后弹出的是模态框没有跳转新的页面,
    在这里插入图片描述
    所以直接查看无需特别对待
    在这里插入图片描述
    向后端只传入商品类型名字和相片
  • 商品
    这里点击添加商品,跳转到新的页面,对于添加商品是新页面则需要考虑其Get请求的情况和Post(即点击添加数据)请求后的情况
  1. Get请求
    因为需要将添加的商品分在卖家指定的类中所以需要后端传给前端当前用户的所有商品类型
  2. Post请求
    则需要将所有前端的数据获取到,并进行保存即可

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
project01/views.py

......
#新加
#商品类型添加
@login_Decorator
def add_goods_type(request):
    seller_id = request.COOKIES.get("seller_id")
    store_id = Store.objects.get(seller_id=seller_id).id
    goodsname=request.POST.get("goodsname")
    logo=request.FILES.get("goodsimg")
    goods_type=GoodsType.objects.create(name=goodsname,logo=logo,store_id=store_id)
    goods_type.save()
    return  redirect("/seller/goods_type_list")
# 添加商品
@login_Decorator
def add_goods(request):
    # 获取该用户所有商品类型
    seller_id = request.COOKIES.get("seller_id")
    store = Store.objects.get(seller_id=seller_id)
    goodstype_obj_list = GoodsType.objects.filter(store_id=store.id).all()
    if request.method=="POST":
        name=request.POST.get("name")
        price=request.POST.get("price")
        bzq=request.POST.get("bzq")
        sczq=request.POST.get("productdate")
        desc=request.POST.get("desc")
        image=request.FILES.get("goodsimg")
        goodstype_id=request.POST.get("goodstype")
        store_id=Store.objects.filter(seller_id=request.COOKIES.get("seller_id")).first().id
        goods=Goods.objects.create(name=name,price=price,bzq=bzq,sczq=sczq,desc=desc,image=image,goodstype_id=goodstype_id,store_id=store_id)
        goods.save()
        return redirect("/seller/goods_list")
    return render(request,"seller/add_goods.html",locals())

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

商品类型和商品修改

这里其实和商品添加原理差不多所以就不重复说了
project01/views.py

#编辑商品类型
@login_Decorator
def edit_goods_type(request):
    if request.method=="POST":
        id=request.POST.get("id")
        goodstype_obj = GoodsType.objects.get(id=id)
        name=request.POST.get("goodsname")
        logo=request.FILES.get("goodsimg")
        # 当没有修改图片时应该存储原图片
        if logo!=None:
            # 删除以前的照片
            img_path = goodstype_obj.logo.name
            path = 'static/img/' + img_path
            os.remove(path)
        else:
            logo=goodstype_obj.logo
        goodstype_obj.name=name
        goodstype_obj.logo=logo
        goodstype_obj.save()
        return redirect("/seller/goods_type_list")
    id = request.GET.get("id")
    goodstype_obj = GoodsType.objects.get(id=id)
    return render(request,"seller/edit_goodstype.html",locals())

# 修改商品
@login_Decorator
def edit_goods(request):

    if request.method=="POST":
        id=request.POST.get("id")
        goods_obj = Goods.objects.get(id=id)
        name = request.POST.get("name")
        price = request.POST.get("price")
        bzq = request.POST.get("bzq")
        sczq = request.POST.get("productdate")
        desc = request.POST.get("desc")
        image = request.FILES.get("goodsimg")
        goodstype_id = request.POST.get("goodstype")

        # 删除以前的照片
        if image!=None:
            img_path = goods_obj.image.name
            path = 'static/img/' + img_path
            os.remove(path)
        goods_obj.name=name
        goods_obj.price=price
        goods_obj.bzq=bzq
        goods_obj.sczq=sczq
        goods_obj.desc=desc
        if image!=None:
            goods_obj.image = image
        goods_obj.goodstype_id=goodstype_id
        goods_obj.save()
        return redirect("/seller/goods_list")
    id = request.GET.get("id")
    goods_obj = Goods.objects.get(id=id)
    goodstype_obj_list = GoodsType.objects.all()
    return render(request,"seller/edit_goods.html",locals())

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

商品类型和商品删除

删除一般正常情况只需要找到要删除的id即可
在创建商品类型时与商品进行关联
在这里插入图片描述

当商品类型删除时,该类型下的所有商品会自动删除
project01/views.py

#删除商品类型
def del_goods_type(request):
    id=request.GET.get("id")
    goodstype_obj=GoodsType.objects.get(id=id)
    # 删除以前的照片
    img_path = goodstype_obj.logo.name
    path = 'static/img/' + img_path
    os.remove(path)
    goodstype_obj.delete()
    return redirect("/seller/goods_type_list")
#删除商品
def del_goods(request):
    id = request.GET.get("id")
    goods_obj = Goods.objects.get(id=id)
    goods_obj.delete()
    return redirect("/seller/goods_list")

当我们删除时令水果
在这里插入图片描述
在这里插入图片描述
点击后:
在这里插入图片描述
在这里插入图片描述

后台页面总结

剩下的功能大部分涉及到前台的数据,所以在这里后台的基本设计就基本上完成了




  • 关注微信公众号【爱上开源】,该公众号会为你提供作者在网上找到有趣的开源项目,会将使用过程写成文章呈现给读者.公众号还提供爬虫和部分计算机资源给读者.如果读者想要什么资源可以私信给我,作者会尽力查询(不要涉嫌违法资源即可)
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值