chapter 3、项目配置

全项目流程目录:https://blog.csdn.net/qq_38472250/article/details/79522337

项目标准源码:http://www.imooc.com/article/45604

目录

 

3.1 数据库连接

3.2 将搭建vue运行环境

3.3-3.6定义后台字段,并进行数据迁移

3.7xadmin配置

3.8将数据导入数据库中

3.9 配置静态文件访问路径


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,}),
]

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值