全项目流程目录:https://blog.csdn.net/qq_38472250/article/details/79522337
项目标准源码:http://www.imooc.com/article/45604
目录
3.1 数据库连接
1、在数据库中新建数据库 mxshop
2、在sittings.py中配置数据库
sittings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "mxshop",
'USER': "root",
'PASSWORD': "520lkl",
'HOST': "127.0.0.1",
'PORT': "3306",
# 'OPTIONS': {'init_command': 'SET storage_engine=INNODB;'}
}
}
3、使用pymysql 不再使用mysql-client(mysql-client与python3不兼容)
在于与sitting同级文件夹下的__Init__.py文件下引入数据库,在连接mysql时需要这样子做,如果不引入将会出现以下错误:
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
__init__.py
import pymysql
pymysql.install_as_MySQLdb()
在工程文件夹下新建以下文件夹
3.2 将搭建vue运行环境
1、在vue所在文件夹下打开cmd运行: cnpm install
2、cnpm run dev
3、打开浏览器输入 http://localhost:8080,或者http://127.0.0.1:8080,打开网页
4、新建三个Django项目:users,users_operation,goods,并将他们注册到sittings.py 中
5、替换系统用户
sittings.py
AUTH_USER_MODEL= "users.UserProfile"#替换系统用户
3.3-3.6定义后台字段,并进行数据迁移
users.modes.py
from datetime import datetime
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class UserProfile(AbstractUser):#扩展用户信息数据库
birthday = models.DateTimeField(verbose_name=u"生日", null=True, blank=True, default=None)
name = models.CharField(max_length=30, verbose_name=u"昵称", null=True, blank=True)
gender = models.CharField(choices=(("male",u"男"),("female",u"女")),default="",max_length=6)
# address = models.CharField(max_length=100,default=u"")
mobile = models.CharField(max_length=11,verbose_name='电话号码')
# image = models.ImageField(upload_to="image/%Y/%m",default=u"image/default.img",max_length=100)#用户头像和默认头像
class Meta:
verbose_name = u"用户信息"
verbose_name_plural = verbose_name
def __str__(self):#admin 管理时返回的题目标题
return self.name
# def unread_message(self):
# '''
# 获取当前用户未读的信息的条数
# 在当前方法内部 引入外部模块,防止循环引用
# '''
# from operation.models import UserMessage
# message = UserMessage.objects.filter(user = self.id,has_read = False)
# return message.count()
class VerifyCodede(models.Model):
code = models.CharField(max_length=6,verbose_name='验证码')
mobile = models.CharField(max_length=11,verbose_name='电话号码')
add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加时间")
class Meta:
verbose_name = u"短信验证码"
verbose_name_plural = verbose_name
def __str__(self):#admin 管理时返回的题目标题
return self.code
goods.models.py
from datetime import datetime
from django.db import models
from DjangoUeditor.models import UEditorField
class GoodsCategory(models.Model):
CATEGORY_TYPE = (
(1,'一级类别'),
(2,'二级类别'),
(3,'三级类别')
)#做choice用
name = models.CharField(max_length=50,verbose_name='类别名',default='',help_text='类别名')
code = models.CharField(max_length=50, verbose_name='类别编号',default='',help_text='类别编号')
desc = models.TextField(verbose_name='类别描述',help_text='类别描述')
category_type = models.CharField(choices=CATEGORY_TYPE, verbose_name='类目级别',help_text='类目级别',max_length=10)
parent_category = models.ForeignKey('self', verbose_name='父类目录级',null=True,blank=True,related_name='sub_cat',on_delete=models.CASCADE)
is_tab = models.BooleanField(default=False, verbose_name='是否导航',help_text='是否导航')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = u"商品类别"
verbose_name_plural = verbose_name
def __str__(self):#admin 管理时返回的题目标题
return self.name
class GoodsCategoryBrand(models.Model):
category = models.ForeignKey(GoodsCategory, verbose_name='商品类目', help_text='商品类目', on_delete=models.CASCADE)
name = models.CharField(max_length=50, verbose_name='品牌名',help_text='品牌名',default='')
desc = models.TextField(verbose_name='品牌描述',help_text='品牌描述',default='',max_length=500)
image = models.ImageField(max_length=100, verbose_name='图片上传',upload_to='brand/images/')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = u"品牌"
verbose_name_plural = verbose_name
def __str__(self):#admin 管理时返回的题目标题
return self.name
class Goods(models.Model):
category = models.ForeignKey(GoodsCategory,verbose_name='商品类目', help_text='商品类目',on_delete=models.CASCADE)
name = models.CharField(max_length=50, verbose_name='商品名', help_text='品牌名', default='')
goods_sn = models.CharField(max_length=50, verbose_name='商品货号', help_text='商品货号', default='')
click_nums = models.CharField(max_length=50, verbose_name='点击数', help_text='点击数', default='')
sold_nums = models.CharField(max_length=50, verbose_name='售卖数', help_text='售卖数', default='')
goods_nums = models.CharField(max_length=50, verbose_name='库存数', help_text='库存数', default='')
market_price = models.FloatField(max_length=50, verbose_name='市场价格', help_text='市场价格', default='')
shop_price = models.FloatField(max_length=50, verbose_name='售卖价格', help_text='售卖价格', default='')
goods_brief = models.CharField(max_length=50, verbose_name='商品简述', help_text='商品简述', default='')
goods_desc = UEditorField(verbose_name='商品描述内容',imagePath='good/images', filePath='goods/files',default='')
ship_free = models.BooleanField(max_length=50, verbose_name='是否免运费', help_text='是否免运费', default='')
goods_front_img = models.ImageField(max_length=50, verbose_name='商品首页图', help_text='商品首页图', default='')
is_new = models.BooleanField(default=False, verbose_name='是否为新品')
is_hot = models.BooleanField(verbose_name='是否为热销商品', default=False)
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = "商品"
verbose_name_plural = verbose_name
def __str__(self):#admin 管理时返回的题目标题
return self.name
class GoodsImage(models.Model):
goods = models.ForeignKey(Goods,verbose_name='商品',related_name='images',on_delete=models.CASCADE)
image = models.ImageField(verbose_name='商品图片',upload_to='brand/images/')
image_url = models.CharField(max_length=100, verbose_name='图片url')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = '商品图片'
verbose_name_plural = verbose_name
def __str__(self):#admin 管理时返回的题目标题
return self.goods.name
class Banner(models.Model):
'''
轮播商品
'''
goods = models.ForeignKey(Goods,verbose_name='商品',on_delete=models.CASCADE)
image = models.ImageField(upload_to='banner',verbose_name='轮播图')
index = models.IntegerField(default=0,verbose_name='轮播顺序')
add_time = models.DateTimeField(default= datetime.now,verbose_name='添加时间')
class Meta:
verbose_name = '轮播图片'
verbose_name_plural = verbose_name
def __str__(self):
return self.goods.name
trade.models.py
from datetime import datetime
from django.db import models
from django.contrib.auth import get_user_model#拿到userprofile
User = get_user_model()
from goods.models import Goods
class ShoppingCart(models.Model):
user = models.ForeignKey(User,verbose_name='用户',on_delete=models.CASCADE)
goods = models.ForeignKey(Goods,verbose_name='商品',on_delete=models.CASCADE)
nums = models.IntegerField(default=0,verbose_name='购买数量')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = "购物车"
verbose_name_plural = verbose_name
def __str__(self):#admin 管理时返回的题目标题
return "%s(%d)".format(self.goods.name,self.goods_nums)
class OrderInfo(models.Model):
'''
订单
'''
ORDER_STATUS = (
('success','成功'),
('cancal','取消'),
('cancal','待支付')
)
# PAY_TYPE = (
# ('alipay','支付宝'),
# ('wechat','微信')
# )
user = models.ForeignKey(User,verbose_name='用户',on_delete=models.CASCADE)
order_sn = models.CharField(max_length=30,verbose_name='订单编号')#订单编号
trade_sn = models.CharField(max_length=100,unique=True,null=True,blank=True,verbose_name='交易编号')#交易编号
pay_status = models.CharField(choices=ORDER_STATUS,max_length=10,verbose_name='订单状态')
post_script = models.CharField(max_length=10,verbose_name='订单留言')
order_mount = models.FloatField(default=0.0,verbose_name='点单金额')
pay_time = models.DateTimeField(null=True,blank=True,verbose_name='支付时间')
address = models.CharField(max_length=100,default='',verbose_name='收货地址')
signer_name = models.CharField(max_length=20,default='',verbose_name='签收人')
signer_mobile = models.CharField(max_length=11,verbose_name='联系电话')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = "订单"
verbose_name_plural = verbose_name
def __str__(self):#admin 管理时返回的题目标题
return str(self.order_sn)
class OrderGoods(models.Model):
'''
订单的商品详情
'''
order = models.ForeignKey(OrderInfo,verbose_name='订单信息',on_delete=models.CASCADE)
goods = models.ForeignKey(Goods,verbose_name='商品',on_delete=models.CASCADE)
goods_num = models.IntegerField(default=0,verbose_name='商品数量')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = "订单商品"
verbose_name_plural = verbose_name
def __str__(self):#admin 管理时返回的题目标题
return str(self.order.order_sn)
user_operation.py
from datetime import datetime
from django.db import models
from django.contrib.auth import get_user_model
User = get_user_model()
from goods.models import Goods
# Create your models here.
class UserFav(models.Model):
'''
用户收藏
'''
user = models.ForeignKey(User,verbose_name='用户',on_delete=models.CASCADE)
goods = models.ForeignKey(Goods,verbose_name='商品',on_delete=models.CASCADE)
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = "用户收藏"
verbose_name_plural = verbose_name
def __str__(self):#admin 管理时返回的题目标题
return self.user.name
class UserLeavingMessage(models.Model):
'''
用户留言
'''
MESSAGE_CHIOCES = (
(1,'留言'),
(2,'投诉'),
(3,'询问'),
(4,'售后'),
(5,'求购')
)
user = models.ForeignKey(User,verbose_name='用户',on_delete=models.CASCADE)
message_type = models.IntegerField(default=1,choices=MESSAGE_CHIOCES,verbose_name='留言',
help_text="留言类型:1(留言),2(投诉),3(询问),4(售后),5(求购)")
subject = models.CharField(max_length=100,default='',verbose_name='主题')
message = models.TextField(default='',verbose_name='留言内容',help_text='留言内容')
file = models.FileField(verbose_name='上传的文件',help_text='上传的文件')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = "用户留言"
verbose_name_plural = verbose_name
def __str__(self): # admin 管理时返回的题目标题
return self.subject
class UserAddress(models.Model):
'''
用户收货地址
'''
user = models.ForeignKey(User,verbose_name='用户',on_delete=models.CASCADE)
district = models.CharField(max_length=100,default='',verbose_name="区域")
address = models.CharField(max_length=100,default='',verbose_name='收货地址')
signer_name = models.CharField(max_length=20,default='',verbose_name='签收人')
signer_mobile = models.CharField(max_length=11,default='',verbose_name='签收电话')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = "收货地址"
verbose_name_plural = verbose_name
def __str__(self): # admin 管理时返回的题目标题
return self.address
3.7xadmin配置
1、在每个项目下面新建adminx.py文件
2在sitting.py中注册adminx
INSTALLED_APPS = [
'xadmin'
'crispy_forms'
]
3、安装以下插件,不用考虑版本,直接使用最新版
xlwt,xlsxwriter插件的安装
4、进行数据迁移,将xadmin添加到数据库
5、将xadmin注册到urls.py文件中
from django.urls import path,include,re_path
import xadmin
urlpatterns = [
path('xadmin/', xadmin.site.urls),
]
6、创建xadmin后台管理超级用户
python manage.py createsuperuser
7、修改系统语言
在sitting.py中,将
LANGUAGE_CODE = 'en-ch' 改为
LANGUAGE_CODE = 'zh-hans'
3.8将数据导入数据库中
在将数据导入数据库中时,一定要检查models是否设计完整,否则保存时会出现以下错误save() prohibited to prevent data loss due to unsaved related object 'goods'.
1、在保存前models中的外键必须先保存
2、boolean类型数据必须给初始值
3、charfield类型数据必须给初始长度
最后实在是没办法,各种连级删除或添加出错时,直接暴力删除数据库和各个app下面的migration里面的python文件,然后重新进行数据迁移,当然这样什么数据都没有了,xadmin后台管理员也要重新设置
3.9 配置静态文件访问路径
sittings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media)
urls.py
from MxShop.settings import MEDIA_ROOT
from django.views.static import serve
urlpatterns = [
re_path(r'^media/(?P<path>.*)$', serve, { 'document_root': MEDIA_ROOT,}),
]