Django框架实现可运营电商网站(一)-- 后台部分

news/2024/5/9 12:09:39/文章来源:https://blog.csdn.net/weixin_39561473/article/details/86775213

文章目录

  • 0 业务准备工作
    • 0.1 产品需求描述
    • 0.2 业务主体描述
    • 0.3 业务逻辑描述
      • 业务点
  • 1、项目准备工作
    • 1.1、创建项目(可用pycharm,也可使用命令,这里用命令行来演示)
    • 1.2、pycharm操作
    • 1.3、配置子url、app静态文件夹、app网页文件夹
    • 1.4、配置项目
      • 1.4.1、安装app (修改)
      • 1.4.2、修改数据库(修改)
      • 1.4.3、配置静态文件路径(在最后增加)
  • 2、后台app样式制作
    • 2.1、后台前端样式
      • 2.1.1 后台模板
      • 2.1.2 修改HTNL中的链接路径
      • 2.1.3 前端页面展示
  • 3、建立后台app模型
    • 3.1 建模
    • 3.2 查看表
  • 4 后台登录页
    • 4.1 修改html页面登陆表单(login.html)
    • 4.2 添加密码加密函数
    • 4.3 登录页函数
    • 4.4 完善登录页
    • 4.5 给其他页面设置cookie验证
      • 4.5.1 编写cookie验证函数
      • 4.5.2 给其他添加装饰器
    • 4.6 session的作用
  • 5、后台登出页
    • 5.1 在视图文件中编写:
    • 5.2 添加路由(urls.py)
    • 5.3 修改按钮路径
  • 6 商品添加页
    • 6.1 商品分类添加
      • 6.1.1页面样式
      • 6.1.2 视图函数
      • 6.1.3 增加路由
      • 6.1.4 增加入口
      • 6.1.5 启动项目查看样式
      • 6.1.6 修改视图函数增加接收数据逻辑
      • 6.1.7 添加分类
    • 6.2 页面细节修改
      • 6.2.1 添加csrf防御
      • 6.2.2 修改所有字段
      • 6.2.3 图片表单
      • 6.2.4 商品类别
      • 6.2.5 商品详情
        • (1)富文本编辑器
          • [1]加载app
          • [2]在setting文件最后添加两行代码,用于处理上传的文件的位置
          • [3]配置路由(url文件)
          • [4]修改models中数据库字段
          • [5]收集静态文件
        • (2)前端页面修改
      • 6.2.6 商品所属卖家
      • 6.2.7 修改提交按钮
    • 6.3 商品添加页视图逻辑
      • 6.3.1 导包
      • 6.3.2 写入数据库逻辑
      • 6.3.3 尝试添加数据
  • 7 商品列表页与详情页
    • 7.1 列表页
      • 7.1.1 数据提取
      • 7.1.2 页面展示
      • 7.1.3 操作设置-编辑
        • (1)修改页视图函数
        • (2)添加urls
        • (3)修改 商品列表页 编辑按钮的链接地址
        • (4)修改 商品添加页 的样式
      • 7.1.3 操作设置-删除
        • (1)编写视图函数
        • (2)增加路由
        • (3)修改 商品列表页 删除按钮的链接地址
    • 7.2 商品详情页
      • 7.2.1 列表页视图函数
      • 7.2.2 列表页路由
      • 7.2.3 修改列表页链接
      • 7.2.4 修改详情页样式
  • 项目后台动态展示


0 业务准备工作

0.1 产品需求描述

完成一个电商网站的项目

0.2 业务主体描述

  • 买家
  • 店铺
  • 商品
  • 订单

关系拓扑图
在这里插入图片描述

0.3 业务逻辑描述

业务点

卖家注册
买家注册买家可以注册店铺,但是一个买家只能有一个店铺买家可以浏览所有的商品可以按照商品的类型进行浏览也可以进入店铺进行浏览买家可以下单购物,(当前只支持支付宝)
买家购买步骤1、买家浏览商品2、买家将商品添加到购物车3、进行结算4、生成订单5、买家确认下单6、买家确认支付7、卖家确认发货8、交易完成9、期间买家可以发起退款1、买家发起2、卖家通过3、退款发起购买过程当中的业务实体描述购物车多样不定量商品的统计订单多样不定量商品的统计二者都需要管理用户、商品、商铺三项卖家管理商品步骤1、卖家可以选择进货(这里以上次作为代替)2、卖家可以对商品进行上架、下架、删除、定价3、卖家可以对订单进行发货和拒收4、卖家可以对商品的销售进行图表统计统计内容:每周、月、年销量

当然我要做的是一个个人电商网站,所以卖家就我一个,不过道理都是一样的,只不过是数据库中卖家数量是一条还是多条的问题。

1、项目准备工作

1.1、创建项目(可用pycharm,也可使用命令,这里用命令行来演示)

通过cmd进入虚拟环境(详情参照django第一期)
创建项目命令

django-admin startproject EarphoneMall

1.2、pycharm操作

通过pycharm自带的工具创建app

  • 这里补充一下:manage.py是每个Django项目中自动生成的一个用于管理项目的脚本文件,需要通过python命令执行。manage.py接受的是Django提供的内置命令。

在这里插入图片描述
因为项目主要分为前台和后台,所以app也分为后台app也就是店铺后台,和前台app也就是买家浏览购买页面。

#安装店铺 app 
startapp Shops
#安装前台app    
startapp Buyers

在这里插入图片描述

1.3、配置子url、app静态文件夹、app网页文件夹

在配置app静态文件夹、app网页文件夹一定要加入区分文件夹
在这里插入图片描述
在主urls中添加子urls

from django.contrib import admin
from django.urls import path,include  #注意这里导入了includeurlpatterns = [path('admin/', admin.site.urls),  path('shops/',include('Shops.urls')),path('buyers/',include('Buyers.urls')),
]

在两个子路由中填写

from django.urls import pathurlpatterns = []

1.4、配置项目

在settings.py中修改配置

1.4.1、安装app (修改)

在这里插入图片描述

1.4.2、修改数据库(修改)

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'EarphoneMall','PORT': 3306,'USER': 'root','PASSWORD': '1234','HOST': 'localhost'}
}

由于django默认使用旧版本的mysql,而我安装的是最新版,所以需要在主项目文件夹下的__init__.py添加语句:

-语句生效前提是,已经安装pymysql。

import pymysql
pymysql.install_as_MySQLdb()

配置中设置了数据库名称为EarphoneMall,所以我们还需要在本机mysql创建数据库EarphoneMall
在这里插入图片描述

1.4.3、配置静态文件路径(在最后增加)

STATIC_URL = '/static/'STATICFILES_DIRS = (os.path.join(BASE_DIR,'static'),
)MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'static')

2、后台app样式制作

2.1、后台前端样式

这里我提供一个后台模板给大家:
链接:https://pan.baidu.com/s/1-p5LvDOn3ZscMOw3Hhr3AQ
提取码:duz4

2.1.1 后台模板

将后台模板拖入到项目中,如果pycharm拖不进去,直接到项目文件夹下复制粘贴

  • HTML放在templates下的shops中
  • 其他样式文件放在static下的shops中
    在这里插入图片描述

2.1.2 修改HTNL中的链接路径

因为原模板中html和样式在同一根目录下,现在被拆开了,所以需要到html中修改路径

  • 小技巧:在pycharm中可以使用ctrl+r进行替换
    在这里插入图片描述
    依次类推替换所有HTML

2.1.3 前端页面展示

修改后台视图文件和子路由,使前端页面可以在网页中展示

  • 视图函数(views):
from django.shortcuts import render
def index(request):return render(request,'shops/index.html',locals())def login(request):return render(request, 'shops/login.html', locals())def goodsAdd(request):return render(request, 'shops/goods_add.html', locals())def goodsList(request):return render(request, 'shops/goods_list.html', locals())
  • 子路由(urls)
from django.urls import path,re_path
from Shops.views import *urlpatterns = [re_path('^$',index),path('index/',index),path('goodsadd/',goodsAdd),path('goodslist/',goodsList),path('login/',login)
]

然后就可以运行程序输入路由查看效果了:
在这里插入图片描述

3、建立后台app模型

3.1 建模

我这里要做的是一个耳机的电商网站,耳机电商网站的后台应该需要有以下几个表:

  • 卖家信息表(sellers):姓名、手机号、邮箱、密码、昵称、头像。
  • 耳机分类表(types):类型名称、描述。
  • 耳机详情表(goods):名称、编号、现售价、原价、库存、概述、详情(富文本)、类型(types)、所属卖家(seller)。
  • 耳机图片表(images):图片路径、图片名称、对应商品(goods)。

按照上面在后台(shops)app中的models.py文件中进行建模

#coding:utf-8
from django.db import models
from ckeditor_uploader.fields import RichTextUploadingFieldclass Seller(models.Model):  #卖家信息表username = models.CharField(max_length = 32)phone = models.CharField(max_length=32)email = models.EmailField()password = models.CharField(max_length=32)nickname = models.CharField(max_length = 32)photo = models.ImageField(upload_to = "image")class Types(models.Model):  #耳机分类表label =  models.CharField(max_length = 32)description = models.TextField()class Goods(models.Model):  #商品goods_name = models.CharField(max_length=32)goods_id = models.CharField(max_length = 32)goods_price = models.FloatField() #原价goods_now_price = models.FloatField() #当前价格goods_num = models.IntegerField() #库存goods_description = models.TextField() #概述goods_content = RichTextUploadingField() #详情types = models.ForeignKey(Types,on_delete = True) #一个分类会有多个商品seller = models.ForeignKey(Seller, on_delete=True) #一家店铺会有多个商品class Image(models.Model):  #商品展示托盘img_path = models.ImageField(upload_to = "image")img_label = models.CharField(max_length = 32)goods = models.ForeignKey(Goods, on_delete=True)  # 一个商品多张图片# Create your models here.

模型建立完毕就可以通过pycharm自带的启动manage.py工具同步数据库。
在这里插入图片描述
一共三个命令:

#检查代码
check
#生成表
makemigrations
#同步字段
migrate

下图红圈为命令,篮圈代表成功。
在这里插入图片描述

3.2 查看表

pycharm提供了完整的生产系统,所以你还可以通过pycharm查看数据库:
第一步:打开数据库管理页面
在这里插入图片描述
第二步:在弹出页面添加数据库,我们使用的是mysql,以后可以点击最右边的database来直接打开管理页面
在这里插入图片描述
第三步:绑定数据库
在这里插入图片描述
这样就可以在右侧查看到数据库中的表了,而且pycharm同样提供了对数据库的图形化增删改查
在这里插入图片描述

4 后台登录页

因为为个人商城,所以后台商户就一个,这里就不制作注册页面了,注册页面的做法和后面要说的数据添加页完全一致,有兴趣做注册逻辑的可以去参考。
所以我直接通过pycharm的数据库管理工具,写入本人的信息,方便在制作登陆时使用。

!!!注意:这里密码是通过md5加密的!!!在这里插入图片描述
登陆页面很简单,注意这里需要进行cookie和session的设置,session可以很方便的在做商品函数的时候辨别这是哪个商家的商品,而cookie可以做到设定要求内免密登陆。

4.1 修改html页面登陆表单(login.html)

模板的登录页是login.html,登录页里只有一个登陆表单,作为一个登陆表单,首先在需要设置form的提交请求方式为post,然后需要给每个表单添加name属性,以便提交到后天进行获取,最后还需要submit按钮,来提交表单(模板默认已经做好了)
在这里插入图片描述

4.2 添加密码加密函数

这是一个默认的规定,注册用户的时候,需要对用户密码进行哈希加密,所以存在数据库中的用户密码也是加过密的,哈希加密是不可逆加密,这样才能保证用户数据的安全。所以在登陆时,需要匹配数据库中的密码,数据库密码加密,而用户登陆输入的密码没有加密,所以需要对用户登陆时的密码也进行加密。

在后台视图函数(views.py)中编写加密函数.

import hashlib#加密函数
def lockpw(pw):  md5 = hashlib.md5()md5.update(pw.encode())result = md5.hexdigest()return result

4.3 登录页函数

登录页的逻辑就是获取页面提交的用户名密码,然后在数据库进行匹配,如果匹配成功,则登陆成功。登陆成功下发cookie和session。
首先在开头导入所有的数据库表,以便后来使用:

from Shops.models import *

登陆成功需要跳转,所以需要导入包HttpResponseRedirect,视图文件第一行后面加入HttpResponseRedirect即可

from django.shortcuts import render,HttpResponseRedirect  

登陆函数如下:

#登录页函数
def login(request):result = {'status':'error','data':''}  #状态标记,用来返回给前端页面登陆不成功的原因if request.method == 'POST' and request.POST: #如果请求方式为POST且有请求内容username = request.POST.get('username') #username是前台页面input标签中name属性所写内容db_user = Seller.objects.filter(username=username).first() #使用filter的方法取出数据库中字段与前台输入相符的人if db_user:  #如果在数据库中取到了,说明有此用户db_password = db_user.password  #取该用户储存在数据库的密码password = lockpw(request.POST.get('password')) #取该用户页面输入的密码并加密if db_password == password:#这里要给返回值设置cookie和session,所以需要把返回值先赋值response = HttpResponseRedirect('/shops/') #登陆成功跳转至首页response.set_cookie('username',db_user.username,max_age=3600) #设置寿命为1小时的cookierequest.session['nickname'] = db_user.nickname #设置sessionreturn responseelse: #如果密码不一致result['data'] = '密码错误'else: #如果取出的用户为空result['data'] = '该商家不存在'return render(request,'shops/login.html',locals())

4.4 完善登录页

为了防止csrf,需要在form便签下添加csrf防御
还需要添加一个登陆状体提醒标签,也就是显示函数中result字典中data存储的状态
在这里插入图片描述
效果如下:
在这里插入图片描述

4.5 给其他页面设置cookie验证

首先很多网站在你没有登陆的时候是无法访问的,在你点击之后会直接跳转到登录页,只有验证cookie后,或者再次登陆后才可以访问,而cookie的意义就是可以使浏览器在你设定的时间里记住登陆信息,再次访问的时候就不需要重复登陆了。

而我们做的后台系统肯定是不能然外人进行访问的,所以为了完成这个效果,需要在视图文件中写一个验证cookie的函数,并作为装饰器作用于其他页面。如果想详细了解这里可以看我之前的文章(Python全栈日记-Django(四))

4.5.1 编写cookie验证函数

在后台的视图文件中(写在所有页面函数的上面,因为其他页面需要使用此装饰器):

#cookie验证装饰器
def cookieVerify(fun):def inner(request,*args,**kwargs):username = request.COOKIES.get("username") #获取cookies中的usernamesession = request.session.get("nickname")  # 获取session中的nicknamedb_user = Seller.objects.filter(username=username).first()if db_user and db_user.nickname == session:  # 校验session和cookiesreturn fun(request, *args, **kwargs) #通过按照原函数返回else: return HttpResponseRedirect("/shops/login/") #校验失败跳转至登录页return inner 

4.5.2 给其他添加装饰器

对于后台管理系统来说,所有的页面都需要登陆后才能访问,所以需要在每个页面的函数之前都添加cookies验证装饰器
在这里插入图片描述
这样就无法越过登陆直接进入主页等页面了,因为我们cookie设置了1小时的有效,所以可以在无痕模式下尝试。

4.6 session的作用

当我们登陆网页后,经常能在首页看到,“欢迎xxx”的字样,这个就可以通过session来完成。
例如我们模板首页也有这样的一个欢迎信息:时间先不管,到后面做首页的时候做成动态的。
在这里插入图片描述
在后台首页页面(index.html)中找到:欢迎管理员 test
修改test为 request.session.nickname :
在这里插入图片描述
效果如下:
在这里插入图片描述

5、后台登出页

既然有登入,那肯定有登出,模板也给提供了登出按钮
在这里插入图片描述
登出的逻辑很简单,点击退出按钮后删除cookie和session,然后跳转至登陆页面。

5.1 在视图文件中编写:

#登出函数
def loginout(request):response = HttpResponseRedirect('/shops/login/')response.delete_cookie('username')del request.session['nickname']return response

5.2 添加路由(urls.py)

在这里插入图片描述

5.3 修改按钮路径

既然指定了路由,那就需要在前端页面中将退出按钮绑定在该路由上:
在这里插入图片描述
这样登出逻辑就做好了。

6 商品添加页

模板已经提供了商品添加页(goods_add.html),但是由于字段与我们使用的不同,所以需要先对页面进行修改。

6.1 商品分类添加

6.1.1页面样式

在添加商品之前,首先要添加商品分类
复制模板的商品添加页,然后修改成分类添加页面:
在这里插入图片描述

6.1.2 视图函数

增加视图函数:

#商品类型添加页
@cookieVerify
def goodsTypeAdd(request):return render(request, 'shops/goodstype_add.html', locals())

6.1.3 增加路由

在urls文件中增加路由
在这里插入图片描述

6.1.4 增加入口

然后在首页添加商品类型添加的入口按钮
在这里插入图片描述

6.1.5 启动项目查看样式

在这里插入图片描述

6.1.6 修改视图函数增加接收数据逻辑

前台添加商品类型后,需要通过视图函数进行接收并存入数据库

#商品类型添加页
@cookieVerify
def goodsTypeAdd(request):if request.method == 'POST' and request.POST:types = Types()types.label = request.POST.get('typelabel')types.description = request.POST.get('typedescription')types.save()return render(request, 'shops/goodstype_add.html', locals())

6.1.7 添加分类

在页面中添加分类
在这里插入图片描述
添加后查看数据库:
在这里插入图片描述

6.2 页面细节修改

6.2.1 添加csrf防御

在这里插入图片描述

6.2.2 修改所有字段

修改页面上的字段,这里有四个特殊字段,先按照正常修改,后面在做细节调整

  • 图片:多文件
  • 分类:选项
  • 详情:富文本
  • 商家:即当前登陆用户,所以隐藏的

注意把input标签的name属性做修改,修改为自己熟悉的单词,方便后面视图函数获取。
在这里插入图片描述
修改过后:
在这里插入图片描述

6.2.3 图片表单

通常商品的展示图都是多张图片,所以我们要修改图片的input标签为多文件上传标签
给input标签添加属性multiple
在这里插入图片描述
这里form表单有个限制,如果想上传多张图片还需要给form标签添加属性

enctype="multipart/form-data"

也就是:
在这里插入图片描述

6.2.4 商品类别

在6.1中我们添加了分类,现在需要将分类用选项的方式进行选择,也就是使用select和option标签。
而对于多个option标签自己写就很费劲了,通过for循环标签就会简单很多
首先,在商品添加视图函数中取出类型表中所有数据:

#商品添加页
@cookieVerify
def goodsAdd(request):types = Types.objects.all()return render(request, 'shops/goods_add.html', locals())

然后修改前端页面的标签:
在这里插入图片描述
效果如下:
在这里插入图片描述

6.2.5 商品详情

商品详情以我们常见的淘宝或者京东,都是以富文本的形式展现在页面上,就是图片+文字,大部分淘宝甚至只有图片,想要在数据库中存储这样的信息,必须用到富文本。

(1)富文本编辑器

文章添加需要使用富文本编辑器,富文本编辑器支持图片添加,字体样式等功能。
在这里插入图片描述
要想使用富文本编辑器首先需要安装ckeditor模块,cmd中输入命令进行安装:

pip install django-ckeditor

然后配置setting文件:

[1]加载app

注意有两个app
在这里插入图片描述

[2]在setting文件最后添加两行代码,用于处理上传的文件的位置
CKEDITOR_UPLOAD_PATH = "static/upload"
CKEDITOR_IMAGE_BACKEND = "pillow"
[3]配置路由(url文件)

在主路由中加载ckeditor的子路由

path('ckeditor/',include('ckeditor_uploader.urls')),

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

[4]修改models中数据库字段

修改models中数据库字段,不用重新同步,因为字段名字虽然改变,但是实际上还是字符串:
我们在写字段的时候就是使用的富文本,所以这里不用改了
首先导入富文本的包:
在这里插入图片描述
修改字段:
在这里插入图片描述

[5]收集静态文件

再给前端使用之前还得先将ckeditor的静态文件收集到项目的静态文件中:

在setting中,修改配置,注释掉之前的静态文件设置(包括meida配置),添加收集配置:

STATIC_URL = '/static/'
# STATICFILES_DIRS = (
#     os.path.join(BASE_DIR,'static'),
# )STATIC_ROOT = os.path.join(BASE_DIR,'static')  #收集专用配置

在项目中使用cmd输入命令或者pycharm点击tools-run manage.py输入命令进行收集:

python manage.py collectstatic

收集完成,改回配置:

STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR,'static'),
)
# STATIC_ROOT = os.path.join(BASE_DIR,'static')  #注释了备用

收集完成后会在项目根目录的static文件夹中显示所有app中的static文件内容,这也是我们设置区分文件的目的。
在这里插入图片描述

(2)前端页面修改

首先在head标签中导入富文本的js文件

<script src="/static/ckeditor/ckeditor/ckeditor.js"></script>

修改商品详情标签为,添加name属性方便给textarea添加富文本样式。
注意我蓝色框中对样式的修改
在这里插入图片描述
页面样式为:
在这里插入图片描述
这里我对样式进行了精简,舍去了不用的功能,详情参见我的另一篇博客(https://blog.csdn.net/weixin_39561473/article/details/87297223)
精简后富文本样式为:
在这里插入图片描述

6.2.6 商品所属卖家

商品必须要和卖家挂钩,但是手动输入费力还容易出错,所以这里可以设置一个隐藏的input标签,在提交的时候会默认提交当前的登陆用户,登陆用户就是商品所属的商家。
同首页显示登陆用户一样,这里也直接从session中获取登陆的商家
在这里插入图片描述

6.2.7 修改提交按钮

模板默认增加按钮使用的是button标签,这里要修改为input标签,类型为submit
在这里插入图片描述
这样页面部分就全部做完了,接下来是添加商品的逻辑部分:

6.3 商品添加页视图逻辑

前台都搭建好了,接下来就是在视图文件里修改添加页的视图函数,
这个视图文件分为两部分,一部分是收集前台关于商品表的字段信息,而另一部分是收集商品图片表的字段信息。
注意点:

  • 类型和商户都是外键,所以需要通过用户输入的先获取到类型表和商户表所对应的信息,然后再保存到商品表中
  • 图片是文件类型,而且是多张图片,所以在获取的时候需要获取文件并以列表的形式获取。
  • 图片是由二进制编码写成,所以我们需要将图片转为二进制然后写入我们的静态文件夹中。
  • 图片存在数据库中的只是一个指向静态文件的地址。
  • 图片地址使用了拼接,所以需要导入os包和配置文件的媒体路径MEDIA_ROOT

6.3.1 导包

在这里插入图片描述

6.3.2 写入数据库逻辑

#商品添加页
@cookieVerify
def goodsAdd(request):types = Types.objects.all()if request.method == 'POST' and request.POST:g = Goods() #实例化数据表g.goods_name = request.POST.get('goodsname')g.goods_id = request.POST.get('goodsid')g.goods_price = request.POST.get('goodsprice')g.goods_now_price = request.POST.get('goodsnowprice')g.goods_num = request.POST.get('goodsnum')g.goods_description = request.POST.get('goodsdescription')g.goods_content = request.POST.get('goodscontent')g.types = Types.objects.get(id=int(request.POST.get('goodstypes')))g.seller = Seller.objects.get(nickname=request.POST.get('seller'))g.save() #保存数据信息for i in request.FILES.getlist('goodsimages'):  #把图片循环出来img = Image() #实例化图片表img.img_path = 'shops/images/goods/'+i.name #name是文件名,内置方法img.img_label = request.POST.get('goodsname')img.goods = gimg.save()path = os.path.join(MEDIA_ROOT,'shops/images/goods/{}'.format(i.name)).replace('\\','/')with open(path, "wb")  as f:  #wb是以二进制打开for j in i.chunks():  #解析图片为2进制文件,全部内容写入到静态文件夹。f.write(j)return render(request,'shops/goods_add.html',locals())

6.3.3 尝试添加数据

富文本可以采用从淘宝详情直接复制粘贴的方式
在这里插入图片描述
最后我添加了一共19个商品,逻辑没啥问题

7 商品列表页与详情页

列表页的功能是展示所有的商品
详情页的功能是展示每个商品的详细信息

7.1 列表页

7.1.1 数据提取

首先在列表的视图函数中把商品数据信息提取出来,提供给前端页面使用:

#商品列表页
@cookieVerify
def goodsList(request):goods = Goods.objects.all()return render(request, 'shops/goods_list.html', locals())

7.1.2 页面展示

在goods_list.html中 修改模板样式为自己可用,并利用for循环标签将数据循环出来。
在这里插入图片描述
最后效果如下:
在这里插入图片描述

7.1.3 操作设置-编辑

有时候我们需要修改现价,这时候就需要用到编辑按钮,那编辑按钮是如何实现的呢?
编辑按钮实际上还是在添加页进行访问,当时要做一个判断,判断目前是添加操作还是修改操作

(1)修改页视图函数

既然要做判断,那就需要做标记,所以给添加页视图函数和修改操作函数添加一个共同的变量,赋予不同的值,以作判断使用。
而且,修改需要将之前填写好的信息再次显示在输入框中,这样就涉及到了一个判断修改的是哪个商品,所以需要用到正则表达式进行匹配。
而关于数据修改后保存入数据库的操作和添加页完全一致。
在这里插入图片描述

(2)添加urls

添加正则。用来匹配所修改商品的id
在这里插入图片描述

(3)修改 商品列表页 编辑按钮的链接地址

需要将编辑按钮链接到商品修改页的url上
在这里插入图片描述

(4)修改 商品添加页 的样式

首先需要将视图函数从数据库取出的数据放入每个input标签的的value中
在这里插入图片描述
然后对按钮文字进行判断,如果dotype(视图函数中的区分变量)为change则按钮为修改
在这里插入图片描述
点击编辑按钮就会和之前不同了,这样就成功了
在这里插入图片描述

7.1.3 操作设置-删除

还有一个操作按钮是删除

(1)编写视图函数

和编辑一样,你首先要确定删除的是哪个商品,这里也需要使用正则,也需要传递参数给函数

#商品删除
@cookieVerify
def goodsDel(request,id):goods = Goods.objects.get(id=int(id))imgs = goods.image_set.all()  #获取商品的所有照片for i in imgs:  #删除存在静态文件夹中的图片os.remove(os.path.join(MEDIA_ROOT,str(i.img_path).replace('\\','/')))imgs.delete() #先删除外键表goods.delete()  # 再删除主键表数据return HttpResponseRedirect("/shops/goodslist/") #跳转到商品列表页

(2)增加路由

在这里插入图片描述

(3)修改 商品列表页 删除按钮的链接地址

在这里插入图片描述
这样,商品删除功能就实现了。(删除一时爽,重新添加火葬场)

7.2 商品详情页

首先复制商品详情页,删除列表内容,制作详情页

7.2.1 列表页视图函数

#商品详情页
@cookieVerify
def goodsDetails(request,id):goods = Goods.objects.get(id=int(id)) #获取商品信息goodsImage = Image.objects.filter(goods=int(id)) #获取商品图片return render(request,'shops/goods_details.html',locals())

7.2.2 列表页路由

在这里插入图片描述

7.2.3 修改列表页链接

修改列表页商品名称的链接,点击名称进入详情页
在这里插入图片描述

7.2.4 修改详情页样式

详情页为了好看这里我导入了jQuery和bootstrap
在这里插入图片描述
最终样式如下:
在这里插入图片描述

项目后台动态展示

在这里插入图片描述

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

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

相关文章

Django框架实现可运营电商网站(二)-- 前台部分

文章目录 1 前台模板修改1.1 模板制作1.2 静态链接1.3 在视图和路由中关联所有页面1.4 修改跳转链接1.5 运行项目1.6 收集静态文件 2 建模3 注册与登陆3.1 注册页面3.1.1 样式3.1.2 需要导入的所有包&#xff1a;3.1.3 密码加密函数&#xff1a;3.1.4 邮箱发送函数&#xff1a;…

mysql 5.6.12源码_最新LAMP源码搭建网站平台PHP5.5.1 + Apache2.4.6 + mysql5.6.12

记录一下&#xff0c;今天配置的这台网站服务器&#xff0c;大部分都是在官方找的最新版源码包。 1.下载安装所需要的最新软件源码包&#xff0c;包括最新的apache、mysql、php以及相关库文件的源码包。 2.检查安装时使用的编译工具是否存在。 3.卸载默认的低版本环境及rpm包环…

网站服务器如何导入数据库,网站服务器如何导入数据库

网站服务器如何导入数据库 内容精选 换一换 PostgreSQL支持逻辑备份。您可使用pg_dump逻辑备份功能&#xff0c;导出备份文件&#xff0c;再通过psql导入到RDS中&#xff0c;实现将PostgreSQL的数据导入到云数据库RDS中。云数据库RDS服务支持开启公网访问功能&#xff0c;通过弹…

阿里云服务器ubuntu18-04下使用wordpress搭建网站/ ‎编辑

** 阿里云服务器ubuntu18-04下使用wordpress搭建网站/ ‎编辑 ** 一. 服务器领取 高校学生可以免费领取,此处不做详述: 二. 配置wordpress 首先进入控制台&#xff1a; 然后远程登陆服务器&#xff08;xshell、putty等&#xff09;。 输入以下两条命令&#xff1a; &…

身为Android程序猿,必不可少的十大网站

&#xfeff;&#xfeff; 身为Android程序猿&#xff0c;必不可少的十大网站&#xff0c;让你更加高效的去开发。 第一&#xff0c;Google&#xff08;http://www.google.com/&#xff09;谷歌是Google公司开发的互联网搜索引擎。主要提供网页搜索&#xff0c;图片搜索&#…

手把手教你每个人都可以拥有的个人博客网站

题记 ------去过的地方越多&#xff0c;越知道自己想回到什么地方去&#xff01; 雨又下了一夜&#xff0c;曾经多少次觉得下雨天是最适合睡觉的天气。而最近的雨&#xff0c;总感觉有些嘈杂&#xff0c;总怕吵醒远方睡梦中的星&#xff0c;晨。以至于翻来覆去睡不着。但是&…

手把手教你使用Hexo和github搭建免费个人博客网站

俗话说的好“吃水不忘挖井人”&#xff0c;当自己体验过Hexo搭建个人网站后&#xff0c;也来分享一下搭建过程遇到的乐趣以及遇到的坑&#xff01; 准备工作&#xff08;电脑配置工具&#xff09; 在搭建Hexo博客之前&#xff0c;首先需要简单在你电脑安装一些工具以及依赖包…

大型网站架构演变和知识体系

之前也有一些介绍大型网站架构演变的文章&#xff0c;例如LiveJournal的、ebay的&#xff0c;都是非常值得参考的&#xff0c;不过感觉他们讲的更多的是每次演变的结果&#xff0c;而没有很详细的讲为什么需要做这样的演变&#xff0c;再加上近来感觉有不少同学都很难明白为什么…

【Python 爬虫 CASE】使用Selenium+BeautifulSoup获取新闻网站文章列表

一、需求 获取腾讯新闻网站(https://news.qq.com/)首页的新闻标题和列表 F12打开开发者工具&#xff0c;查看源代码 二、实现 Step1&#xff1a;获取网页源代码 如果使用requests库获取源代码 import requests res requests.get(http://news.qq.com/)但是这种方式获取的…

【Python 爬虫 CASE】使用Requests+BeautifulSoup获取新闻网站文章内容并整理成表

一、需求 获取新浪新闻网站(http://news.sina.com.cn/china/)首页的新闻内容 F12打开开发者工具&#xff0c;查看源代码 打开新闻链接&#xff0c;获取该新闻文章的“内容”、“标题”、“来源” F12打开开发者工具&#xff0c;查看源代码 二、实现 Step1&#xff1a;构建…

Magento开发教程 - 后台设置多个网站,商店和商店视图

1: 创建产品根目录 登录到Magento 2后台.点击 Products > Categories.点击 Add Root Category.在 Category Name 输入分类名称. 确保 Enable Category 设置 Yes. 如下图&#xff1a; 点击 Save. 2: 创建 websites&#xff08;网站&#xff09; 点击 Stores > 设置 >…

visual studio 2010教程-创建网站项目

1.打开visual studio 2010 选择新建 - 网站 2.进行对应的设置 3.创建完毕之后&#xff0c;在解决方案资源管理器中出现对应的项目 4.在项目名称上 右键 - 添加新项 5.选择web窗体&#xff0c;并命名新建的页面为index.aspx 6.创建完毕之后的工程 7.首页的源代码如下 8.接下来…

项目总结——Java web之实现当当网网站

Java web之实现当当网网站 运行环境&#xff1a;JDK1.8tomcat8.4MySQL5servlet技术 源码结构 CategoryDAO.java package com.tarena.dao;import java.sql.SQLException; import java.util.List;import com.tarena.entity.Category;public interface CategoryDAO {public Lis…

如何使用IIS发布网站?

如何使用IIS发布网站&#xff1f; 1.搜索输入 IIS&#xff0c;找到IIS&#xff08;Internet Information Services&#xff09; 2.添加网站 3.填写相关内容属性 4.浏览默认文档 5.浏览发布界面 有任何疑问和和源码需求敬请关注公众号【蜗牛资源社】 欢迎交流学习&#x…

C++网站开发MVC框架TreeFrog Framework教程——2.简单示例

下面以一个博客文章管理网站的开发实例作为这个框架的使用入门教程。 1.安装TreeFrog Framework 下面以Ubuntu为例说明&#xff1a; 1.1.安装框架的依赖库&#xff1a; $ sudo apt-get install -y qt5-default qt5-qmake libqt5sql5-mysql libqt5sql5-psql libqt5sql5-odb…

C++网站开发MVC框架TreeFrog Framework教程——8.Otama模板

Otama模板系统的最大特点在于表现层的纯粹性&#xff0c;使用原生的HTML标签取代形如<%...%>这样的嵌入脚本代码。 使用之前&#xff0c;记得把配置文件&#xff08;development.ini&#xff09;中的模板系统设置为Otama&#xff1a; TemplateSystemOtamaOtama模板文件…

从零开始开发一个大型网站

从零开始开发一个大型网站 更新&#xff1a;前端代码已全部由TypeScript进行重写 这是本人第一个从零开始开发一个大型网站&#xff08;前后端部署代码&#xff09;&#xff0c;是一个内容分享社区&#xff0c;详细信息见github。目前还是开发中后期&#xff0c;随后还要进行…

使用MVC框架开发网站(一)

概述 本章您将学会&#xff1a; 1.MVC的概念及使用 2.MVC与ASP.NET的区别 3.路由和URL导向 4.控制器和视图 5.模型与模型状态 6.过滤器 7……. 第1章_MVC与ASP.NET的区别 1.1概述 MVC是一种流行的Web应用架构技术&#xff0c;他把Web应用划分成Model、Controller和V…

利用beego开发网站(一)

在这里&#xff0c;我将分享我这段时间学到的关于怎样搭建一个简单的beego项目&#xff0c;分享的东西仅仅是入门级别。 一&#xff0c;安装golang的开发工具和语言的编译工具&#xff08;如果本步骤不会的话&#xff0c;请去golang中国社区查阅资料进行开发搭建&#xff09; 我…

使用ThinkPHP框架快速开发网站(多图)

使用ThinkPHP框架快速搭建网站 这一周一直忙于做实验室的网站&#xff0c;基本功能算是完成了。比较有收获的是大概了解了ThinkPHP框架。写一些东西留作纪念吧。如果对于同样是Web方面新手的你有一丝丝帮助&#xff0c;那就更好了挖。 以前用PHP做过一个很蹩脚的网站&#xff0…