后台页面实现商品管理->商品类型
成果图
商品类型界面
商品类型添加
商品类型修改
商品类型删除
商品界面
商品添加
商品修改
商品删除
项目步骤
建模
分析商品和商品类型与其他数据表之间的关系
- 商品与商品类型
一个商品类型可以有多个属于该类型的商品,所以商品类型与商品是一对多关系 - 商品与店铺
一个店铺可以有多个商品,不同的店铺有着相同的商品名但是意义不一样,因为在这个项目下每个商品都是属于自己的商家建立的而不是系统建立的,所以在这里是一对多
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(即点击添加数据)请求后的情况
- Get请求
因为需要将添加的商品分在卖家指定的类中所以需要后端传给前端当前用户的所有商品类型 - 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")
当我们删除时令水果时
点击后:
后台页面总结
剩下的功能大部分涉及到前台的数据,所以在这里后台的基本设计就基本上完成了
-
关注微信公众号【爱上开源】,该公众号会为你提供作者在网上找到有趣的开源项目,会将使用过程写成文章呈现给读者.公众号还提供爬虫和部分计算机资源给读者.如果读者想要什么资源可以私信给我,作者会尽力查询(不要涉嫌违法资源即可)