手把手创建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.csdn.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 = '1337765078@qq.com'  # 邮箱
    seller.id_number = '131125111111111111'  # 身份证
    seller.save()
    return render(request, 'seller/iframeExample.html')
    # return redirect('/seller/login/')

我就不一一啰嗦了,估计你们也是直接拷贝的,注释什么都写有了
然后讲解一下 装饰器 是为了登录之后再没一个页面都现在个人信息已经登录了,
整个项目其实就是把信息输入然后获取到数据库再展现出来的流程

子路由:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值