手把手创建django项目
这个项目必须在了解熟悉数据库表的情况下写的电商项目
项目逻辑
1,下载django模块(自行百度吧)
2,创建数据库表
3,写视图里面的业务逻辑
4,把HTML跟后台数据库连接
报错写的请拷贝我提供的代码*(不懂的请用翻译软件翻译,)*
主要的是写业务逻辑
业务关系
商家、 商品、图片、银行卡、分类
商家 和 银行卡 一对多
商品 和 图片 一对多
类型 和 商品 一对多
商家 和 商品 一对多
第一步:
新建文件夹
然后在新建项目
在models.py文件里面写自己表,
from django.db import models
解释一下内容大致意思
举个例子:
Seller类里面的表内容
CharField是字符类型最大32
ImageField(upload_to=‘image’)是图片类型上传到image那个图片类里面
models.ForeignKey(Seller, on_delete=True)这个是添加外键,数据库连表的意思
,一对多的意思,就是一个商家对应多个商品
(最后出来的效果是这样的,目前还没到这一步)
写完后配置路由,shopping主路由里面里urls文件
自己写一个seller 配置 ,include(‘Seller.urls’)是配置(链接)项目子路由的意思,
然后复制有效字段到子路由去,改一下
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path(‘admin/’, admin.site.urls),
path(‘seller/’,include(‘Seller.urls’)),
]
然后改成这样
index 是一个html的名字 ,目前我们还没有写Html,下一步写HTML的文件
文件我都写在另一个贴链接上了
先建一个 文件夹放HTML模板 名字必须
templates[添加链接描述]
HTML 的链接,自己新建吧
(https://blog.****.net/weixin_44471472/article/details/88357084)
报错的话请拷贝我的文件自行研究`
from django.db import models
# Create your models here.
# 分类表
class Types(models.Model):
label = models.CharField(max_length=32) # 分类名称 例如 水果类,水产类
parent_id = models.IntegerField() # 父id
description = models.TextField() # 分类描述,对类型的一个描述。
# 卖家
class Seller(models.Model):
username = models.CharField(max_length=32) # 用户名
password = models.CharField(max_length=32) # 密码
nickname = models.CharField(max_length=32) # 昵称
photo = models.ImageField(upload_to='image') # 卖家图片
phone = models.CharField(max_length=32) # 电话
address = models.CharField(max_length=32) # 地址
email = models.EmailField() # 邮箱
id_number = models.CharField(max_length=32) # 身份证
from ckeditor_uploader.fields import RichTextUploadingField
# 商品类
class Goods(models.Model):
goods_id = models.CharField(max_length=32) # 商品编号,例如001
goods_name = 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() # 使用富文本字段
goods_show_time = models.DateField() # 发布时间
types = models.ForeignKey(Types, on_delete=True) # 一个类型对应多个商品
seller = models.ForeignKey(Seller, on_delete=True) # 一个用户对应多个商品
# 图片类
class Image(models.Model):
img_adress = models.ImageField(upload_to='image') # 图片保存的路径
img_label = models.CharField(max_length=32) # 图片 名称
img_description = models.TextField() # 图片描述
goods = models.ForeignKey(Goods, on_delete=True) # 一个商品对应多个图片
def __str__(self):
return '{}-{}-{}'.format(self.img_adress, self.img_label, self.img_description)
# 银行卡
class BankCard(models.Model):
number = models.CharField(max_length=32) # 卡号
bankAddress = models.CharField(max_length=32) # 地址
username = models.CharField(max_length=32) # 持卡人姓名
idCard = models.CharField(max_length=32) # 省份证
phone = models.CharField(max_length=32) # 电话
seller = models.ForeignKey(Seller, on_delete=True) # 一个卖家对应多张银行卡
然后
写我们的视图,views文件,
先科普一下知识 请求分为POST 请求和get的请求
还是报错的话请拷贝我提供的代码 然后运行进去,首先运行test.html,注册一下
先注册后台管理页面
登录功能
这个是注销功能
获取HTML里面的内容
然后保存到数据库
from django.shortcuts import render, redirect
from Seller import models
import hashlib
import datetime
# Create your views here.
def pwd_encrypt(password):
"""使用 md5 进行 密码加密"""
md5 = hashlib.md5()
md5.update(password.encode())
result = md5.hexdigest()
return result
# 添加装饰器
def seller_decorator(func):
def inner(request, *args, **kwargs):
username = request.COOKIES.get('username')
nickname = request.session.get('nickname')
if username and nickname:
return func(request, *args, **kwargs)
else:
"""重定向到登陆页面"""
return redirect('/seller/login/')
return inner
@seller_decorator
def index(request):
return render(request, 'seller/index.html')
# 登陆功能
def login(request):
result = {'error': ''}
if request.method == 'POST':
name = request.POST.get('username')
seller_lst = models.Seller.objects.filter(username=name) # QuerySet
# user_lst = models.Seller.objects.filter(username=name).first() # QuerySet
if seller_lst:
password = request.POST.get('password')
pwd = pwd_encrypt(password) # 加密后的pwd
seller = seller_lst[0]
if seller.password == pwd:
# 添加cookie 和session
response = redirect('/seller/index/')
response.set_cookie('username', seller.username)
response.set_cookie('id', seller.id)
request.session['nickname'] = seller.nickname
return response
else:
result['error'] = '密码不正确'
else:
"""用户名不存在"""
result['error'] = '用户名不存在'
return render(request, 'seller/login.html', {'result': result})
def logout(request):
response = redirect('/seller/login/')
response.delete_cookie('username')
response.delete_cookie('id')
del request.session['nickname']
return response
@seller_decorator
def goods_add(request):
"""添加商品"""
if request.method == 'POST':
# 1.获取数据
goods_num = request.POST.get('goods_num') # 商品编号
goods_name = request.POST.get('goods_name') # 商品名称
goods_oprice = request.POST.get('goods_oprice') # 商品原价
goods_xprice = request.POST.get('goods_xprice') # 商品现价
goods_count = request.POST.get('goods_count') # 库存
goods_description = request.POST.get('goods_description') # 商品描述
goods_type = request.POST.get('goods_type') # 商品类型 --手动写id
goods_content = request.POST.get('goods_content') # 商品详情
imgs = request.FILES.getlist('userfiles')
# 2.保存数据库
g = models.Goods()
g.goods_id = goods_num # 商品编号,例如001
g.goods_name = goods_name # 商品名称
g.goods_price = goods_oprice # 原价
g.goods_now_price = goods_xprice # 现价
g.goods_num = goods_count # 库存
g.goods_description = goods_description # 简单描述
g.goods_content = goods_content # 详情,比较详细的描述
g.goods_show_time = datetime.datetime.now() # 发布时间
g.types = models.Types.objects.get(id=int(goods_type)) # 一个类型对应多个商品
seller_id = request.COOKIES.get('id')
g.seller = models.Seller.objects.get(id=seller_id) # 一个用户对应多个商品
g.save()
# 将上传的图片保存到数据库
for index, img in enumerate(imgs):
# 将图片保存到服务器
file_path = 'static/seller/images/{}_{}.{}'.format(goods_name, index, img.name.rsplit('.', 1)[1])
with open(file_path, 'wb') as f:
for i in img.chunks():
f.write(i)
# 将图片的路径保存到数据库中
image = models.Image() # goods_name_0.jpg, goods_name_1.jpg,
image_path = 'seller/images/{}_{}.{}'.format(goods_name, index, img.name.rsplit('.', 1)[1])
image.img_adress = image_path
image.img_label = img.name
image.img_description = 'this is a photo'
image.goods = g
image.save()
return redirect('/seller/goods_list/')
return render(request, 'seller/goods_add.html')
@seller_decorator
def goods_list(request):
# 从数据库中获取所有商品记录,展示到页面上
goods_lst = models.Goods.objects.all()
return render(request, 'seller/goods_list.html', locals())
@seller_decorator
def goods_change(request):
if request.method == 'GET':
ids = request.GET.get("id")
goods = models.Goods.objects.get(id=int(ids))
return render(request, 'seller/goods_change.html', {'goods': goods})
else:
"""post 请求"""
goods_num = request.POST.get('goods_num')
goods_name = request.POST.get('goods_name')
goods_oprice = request.POST.get('goods_oprice')
goods_xprice = request.POST.get('goods_xprice')
goods_count = request.POST.get('goods_count')
goods_description = request.POST.get('goods_description')
goods_type = request.POST.get('goods_type')
goods_content = request.POST.get('goods_content')
imgs = request.FILES.getlist('userfiles')
goods_id = request.POST.get('id') # 获取表单传递过来的id
# 2.保存数据库
g = models.Goods.objects.get(id=int(goods_id))
g.goods_id = goods_num # 商品编号,例如001
g.goods_name = goods_name # 商品名称
g.goods_price = goods_oprice # 原价
g.goods_now_price = goods_xprice # 现价
g.goods_num = goods_count # 库存
g.goods_description = goods_description # 简单描述
g.goods_content = goods_content # 详情,比较详细的描述
g.goods_show_time = datetime.datetime.now() # 发布时间
g.types = models.Types.objects.get(id=int(goods_type)) # 一个类型对应多个商品
seller_id = request.COOKIES.get('id')
g.seller = models.Seller.objects.get(id=seller_id) # 一个用户对应多个商品
g.save()
# 将上传的图片保存到数据库
for index, img in enumerate(imgs):
# 将图片保存到服务器
file_path = 'static/seller/images/{}_{}.{}'.format(goods_name, index, img.name.rsplit('.', 1)[1])
with open(file_path, 'wb') as f:
for i in img.chunks():
f.write(i)
# 将图片的路径保存到数据库中
image = models.Image() # goods_name_0.jpg, goods_name_1.jpg,
image_path = 'seller/images/{}_{}.{}'.format(goods_name, index, img.name.rsplit('.', 1)[1])
image.img_adress = image_path
image.img_label = img.name
image.img_description = 'this is a photo'
image.goods = g
image.save()
return redirect('/seller/goods_list/')
import os
@seller_decorator
def goods_delete(request):
goods_id = request.GET.get('id')
goods_obj = models.Goods.objects.get(id=int(goods_id))
# 删除关联的图片
imgs_lst = goods_obj.image_set.all()
for img in imgs_lst:
print(img.img_adress.name) # seller/images/fef_2.jpg
path = 'static/' + img.img_adress.name
os.remove(path)
imgs_lst.delete()
# 删除商品对象
goods_obj.delete()
return redirect('/seller/goods_list/')
# 注册功能
def test(request):
seller = models.Seller()
seller.username = 'admin' # 用户名
seller.password = pwd_encrypt('admin') # 密码 --->>需要加密
seller.nickname = '老毛桃' # 昵称
seller.photo = 'images/1.jpg' # 卖家图片
seller.phone = '15300162488' # 电话
seller.address = '北京昌平' # 地址
seller.email = '[email protected]' # 邮箱
seller.id_number = '131125111111111111' # 身份证
seller.save()
return render(request, 'seller/iframeExample.html')
# return redirect('/seller/login/')
我就不一一啰嗦了,估计你们也是直接拷贝的,注释什么都写有了
然后讲解一下 装饰器 是为了登录之后再没一个页面都现在个人信息已经登录了,
整个项目其实就是把信息输入然后获取到数据库再展现出来的流程
子路由: