模型开始搭建
创建apps
开始创建应用的时候:python manage.py start user(cart,goods,order)
然后在dailyfresh:下面新建一个python包apps,主要用来存放上面创建的所有应用,
Settings.py
因为创建了这个就需要注册他们,为了省些代码,就将apps列入绝对地址:
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))#apps添加为绝对路径
然后就是注册应用的时候:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'tinymce',
'user',
'goods',
'cart',
'order',
]
接下来就是配置数据库,static,templates,等:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'dailyfresh',
'USER':'root',
'PASSWORD':'mysql',
'HOST':'localhost',
'PORT':3306,
}
}
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
STATIC_URL = '/static/'
STATICFILES_DIRS=[os.path.join(BASE_DIR,'static')]
然后就是因为我们要自己创建后台用户管理系统,就要背弃以前的后台用户管理,重写user后台就需要在models.py里面用from Django.contrib.auth.models import ABstractBaseUser来继承和重写,所以就需要在settings.py里面配置:
#自己建的默认用户管理,代替以前Django默认的后台用户管理系统
AUTH_USER_MODEL='user.User'
最后就是富文本配置(主要就是应用注册,和富文本框设置,urls.py设置):
TINYMCE_DEFAULT_CONFIG={
'theme':'advanced',
'width':600,
'heigth':400,
}
到这里就结束了,所有的settings.py代码如下:
"""
Django settings for dailyfresh project.
Generated by 'django-admin startproject' using Django 2.2.8.
For more information on this file, see
https://docs.djangoproject.com/en/2.2/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.2/ref/settings/
"""
import os
import sys
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))#apps添加为绝对路径
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'xu#u-f+yt(3sn@bafg=xx2h_z*d44=p8go+ux%my-twk4)-&-('
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'tinymce',
'user',
'goods',
'cart',
'order',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'dailyfresh.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'dailyfresh.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
#自己建的默认用户管理,代替以前Django默认的后台用户管理系统
AUTH_USER_MODEL='user.User'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'dailyfresh',
'USER':'root',
'PASSWORD':'mysql',
'HOST':'localhost',
'PORT':3306,
}
}
# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS=[os.path.join(BASE_DIR,'static')]
TINYMCE_DEFAULT_CONFIG={
'theme':'advanced',
'width':600,
'heigth':400,
}
Dailyfresh.urls.py
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('tinymce/',include('tinymce.urls')),
path('user/',include(('user.urls','user'),namespace='user')),#用户管理
path('cart/',include(('cart.urls','cart'),namespace='cart')),#购物车
path('order/',include(('order.urls','order'),namespace='order')),#订单
path('',include(('goods.urls','goods'),namespace='goods')),#商品模块
]
Models.py
User.models.py
from django.db import models
from django.contrib.auth.models import AbstractBaseUser#说明是一个抽象模型类
from db.base_model import BaseModel
# Create your models here.
class User(AbstractBaseUser,BaseModel):
'''用户模型类'''
#identifier必须有,不然后报错abstractbaseuser主要是用来重写django默认的后台user
identifier = models.CharField(max_length=40, unique=True)
USERNAME_FIELD = 'identifier'
class Meta:
db_table='df_user'
verbose_name='用户'#这个生成的是“用户s”
verbose_name_plural=verbose_name#这个可以将后面s去掉
class Address(BaseModel):
'''用户地址模型类 一个用户可以对应多个收件地址,所以建立用户和地址一对多关系'''
user=models.ForeignKey('User',verbose_name='所属账户',on_delete=models.CASCADE)
receiver=models.CharField(max_length=20,verbose_name='收件人')
addr=models.CharField(max_length=256,verbose_name='收件地址')
zip_code=models.CharField(max_length=6,null=True,verbose_name='邮政编码')
phone=models.CharField(max_length=11,verbose_name='收件人电话')
is_default=models.BooleanField(default=False,verbose_name='是否默认')
class Meta:
db_table='df_address'
verbose_name='地址'
verbose_name_plural=verbose_name
cart.models.py
from django.db import models
# Create your models here.
Order.models.py
from django.db import models
from db.base_model import BaseModel
# Create your models here.
class OrderInfo(BaseModel):
'''订单模型类'''
PAY_METHOD_CHOICES=(
(1,'货到付款'),
(2,'微信支付'),
(3,'支付宝'),
(4,'银联支付'),
)
ORDER_STATUS_CHOICES=(
(1,'待支付'),
(2,'待发货'),
(3,'待收货'),
(4,'待评价'),
(5,'已完成'),
)
order_id=models.CharField(max_length=128,primary_key=True,verbose_name='订单id')
user=models.ForeignKey('user.User',verbose_name='用户',on_delete=models.CASCADE)
addr=models.ForeignKey('user.Address',verbose_name='地址',on_delete=models.CASCADE)
pay_method=models.SmallIntegerField(choices=PAY_METHOD_CHOICES,default=3,verbose_name='支付方式')
total_count=models.IntegerField(default=1,verbose_name='商品数量')
total_price=models.DecimalField(max_digits=10,decimal_places=2,verbose_name='商品总价')
transit_price=models.DecimalField(max_digits=10,decimal_places=2,verbose_name='订单运费')
order_status=models.SmallIntegerField(choices=ORDER_STATUS_CHOICES,default=1,verbose_name='支付状态')
trade_no=models.CharField(max_length=128,verbose_name='支付编号')
class Meta:
db_table='df_order_info'
verbose_name='订单'
verbose_name_plural=verbose_name
class OrderGoods(BaseModel):
'''订单商品模型类 上面是所有订单,然后这个是每个订单对应的详细订单商品'''
order=models.ForeignKey('OrderInfo',verbose_name='订单',on_delete=models.CASCADE)
sku=models.ForeignKey('goods.GoodsSKU',verbose_name='商品sku',on_delete=models.CASCADE)
count=models.IntegerField(default=1,verbose_name='商品数量')
price=models.DecimalField(max_digits=10,decimal_places=2,verbose_name='商品价格')
comment=models.CharField(max_length=256,verbose_name='评论')
class Meta:
db_table='df_order_goods'
verbose_name='订单商品'
verbose_name_plural=verbose_name
goods.models.py
from django.db import models
from tinymce.models import HTMLField
from db.base_model import BaseModel
# Create your models here.
class GoodsType(BaseModel):
'''商品类型模型类'''
name=models.CharField(max_length=20,verbose_name='种类名称')
logo=models.CharField(max_length=20,verbose_name='标识')
image=models.ImageField(upload_to='type',verbose_name='商品类型图片')
class Meta:
db_table='df_goods_type'
verbose_name='商品类型'
verbose_name_plural=verbose_name
def __str__(self):
return self.name
class GoodsSKU(BaseModel):
'''商品SKU模型类'''
status_choices = (
(0, '下线'),
(1, '上线'),
)
type = models.ForeignKey('GoodsType', verbose_name='商品种类',on_delete=models.CASCADE)
goods = models.ForeignKey('Goods', verbose_name='商品SPU',on_delete=models.CASCADE)
name = models.CharField(max_length=20, verbose_name='商品名称')
desc = models.CharField(max_length=256, verbose_name='商品简介')
price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='商品价格')
unite = models.CharField(max_length=20, verbose_name='商品单位')
image = models.ImageField(upload_to='goods', verbose_name='商品图片')
stock = models.IntegerField(default=1, verbose_name='商品库存')
sales = models.IntegerField(default=0, verbose_name='商品销量')
status = models.SmallIntegerField(default=1, choices=status_choices, verbose_name='商品状态')
class Meta:
db_table = 'df_goods_sku'
verbose_name = '商品'
verbose_name_plural = verbose_name
class Goods(BaseModel):
'''商品spu模型类 商品spu对sku是一对多关系'''
name=models.CharField(max_length=20,verbose_name='商品spu名称')
detail=HTMLField(blank=True,verbose_name='商品详情')
class Meta:
db_table='df_goods'
verbose_name='商品spu'
verbose_name_plural=verbose_name
class GoodsImage(BaseModel):
'''商品图片模型类'''
sku = models.ForeignKey('GoodsSKU', verbose_name='商品',on_delete=models.CASCADE)
image = models.ImageField(upload_to='goods', verbose_name='图片路径')
class Meta:
db_table = 'df_goods_image'
verbose_name = '商品图片'
verbose_name_plural = verbose_name
class IndexGoodsBanner(BaseModel):
'''首页轮播商品展示模型类'''
sku = models.ForeignKey('GoodsSKU', verbose_name='商品',on_delete=models.CASCADE)
image = models.ImageField(upload_to='banner', verbose_name='图片')
index = models.SmallIntegerField(default=0, verbose_name='展示顺序')
class Meta:
db_table = 'df_index_banner'
verbose_name = '首页轮播商品'
verbose_name_plural = verbose_name
class IndexTypeGoodsBanner(BaseModel):
'''首页分类商品展示模型类'''
DISPLAY_TYPE_CHOICES = (
(0, "标题"),
(1, "图片")
)
type = models.ForeignKey('GoodsType', verbose_name='商品类型',on_delete=models.CASCADE)
sku = models.ForeignKey('GoodsSKU', verbose_name='商品SKU',on_delete=models.CASCADE)
display_type = models.SmallIntegerField(default=1, choices=DISPLAY_TYPE_CHOICES, verbose_name='展示类型')
index = models.SmallIntegerField(default=0, verbose_name='展示顺序')
class Meta:
db_table = 'df_index_type_goods'
verbose_name = "主页分类展示商品"
verbose_name_plural = verbose_name
class IndexPromotionBanner(BaseModel):
'''首页促销活动模型类'''
name = models.CharField(max_length=20, verbose_name='活动名称')
url = models.URLField(verbose_name='活动链接')
image = models.ImageField(upload_to='banner', verbose_name='活动图片')
index = models.SmallIntegerField(default=0, verbose_name='展示顺序')
class Meta:
db_table = 'df_index_promotion'
verbose_name = "主页促销活动"
verbose_name_plural = verbose_name
迁移数据库文件的时候遇到的问题
1.下面这个主要就是dailyfresh.urls.py这个里面报的错,namespace在include里面的位置,改了,版本不一样,
改了以后应该这样写:
url(r'^users/', include(('users.urls', 'users'), namespace='users')),
2.这个错误是因为重写和继承django默认的后台管理user是报的错,ABstractBaseUser里面缺少一些代码:
identifier = models.CharField(max_length=40, unique=True)
USERNAME_FIELD = 'identifier'
数据库展示
最后到此就结束了,主要就是一些项目开始搭建的模型一些细节或者注意的问题,希望能帮助到大家,可以的话,希望涨涨人气,这也是2019年最后的挣扎把,快步入2020年了,该换个样子前进了,加油!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!