python—Django写一个商城

14 篇文章 0 订阅
4 篇文章 0 订阅

创建数据库(这里一定要注意,要加上编码合格式!!!create database 数据库名称 charset=utf8),我这里创建了用户表User,课程表csdn_course,课程信息表course,分了两个app:User和course

#user,model
from django.db import models

# Create your models here.
class User(models.Model):
    account = models.CharField(max_length=16, unique=True, verbose_name='账号')#
    password = models.CharField(max_length=16, verbose_name='密码')
    username = models.CharField(max_length=16, verbose_name='用户名')
    money = models.DecimalField(max_digits=12, decimal_places=2, default=0, verbose_name='余额')# 总位数12,小数位2
    # PositiveSmallIntegerField:相当于tinyint类型
    gender = models.PositiveSmallIntegerField(default=0,verbose_name='性别')# 0:男,1:女,默认0等价于tint
    tel = models.CharField(max_length=11,default='',verbose_name='手机号')

#course model
from django.db import models
import datetime
from user.models import User

# Create your models here.
# 课程种类表
class Category(models.Model):
    name = models.CharField(max_length=50, unique=True, verbose_name='课程种类')

# 课程内容表
class Course(models.Model):
    #verbose_name显示在后台的名称
    courseName = models.CharField(max_length=40,verbose_name='课程名称')
    # FileField类型,可以在Admin后台管理中支持文件上传
    fileName = models.FileField(verbose_name='文件名称')
    # ImageField类型,Admin后台管理支持图片的上传
    imgname = models.ImageField(verbose_name='课程图片')
    # ForeignKey,课程的种类,引用Category表
    # 参数:
    #   to:外键引用的表,会自动定位到表中的主键
    #   related_name:表示反向查找,从category查找course,查找某一课程种类包括的具体课程对象
    #   on_delete=models.CASCADE:级联操作,删除种类的话,这种类中对应的课程也会被删除
    pCategory = models.ForeignKey(to=Category, related_name='courses_set', on_delete=models.CASCADE,verbose_name='课程类别')
    # DecimalField类型
    # 参数:
    #   max_digits:最大长度
    #   decimal_places:小数位
    price = models.DecimalField(max_digits=7, decimal_places=2, default=0, verbose_name='售价')
    summary = models.CharField(max_length=1000, default='', verbose_name='课程介绍')
    status = models.PositiveSmallIntegerField(default=0, verbose_name='状态')						# 0:收费 1:免费,默认0
    # 创建的时间默认为当前的时间
    createDatetime = models.DateTimeField(default=datetime.datetime.now(),verbose_name='创建时间')
    # ManyToManyField,多对多定义
    userBuyer = models.ManyToManyField(to=User, related_name='userBuyer_set',verbose_name='购买用户')
    # ManyToManyField,多对多定义
    userShoppingcart = models.ManyToManyField(to=User, related_name='userShoppingcart_set', verbose_name='加入购物车的用户')

迁移文件,执行文件(这个不写了,都一样)
。。。。runserver。。。。。。
让软件运行起来
输入ip\admin
看看能不能进入后台管理
能,注册管理员:python manage.py createsuperuser
输入用户名,输入邮箱,输入密码,y确定
#给后台注册app
在各自app的admin文件下输入下面的代码:(别忘了from)

#User:
@admin.register(User)
class userAdmin(admin.ModelAdmin):
    pass

#Course
from .models import Course,Category
# Register your models here.
#给后台管理器注册App
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    pass
@admin.register(Course)
class courseadmin(admin.ModelAdmin):
    pass

在这里插入图片描述
以上没问题,为后台管理命名,在任意app的admin下,复制一下代码:

admin.site.site_header = 'CSDN微课后台管理'
admin.site.index_title = '后台系统'
admin.site.site_title = '管理'

看看效果:

在这里插入图片描述
继续修改app名称,和表名:
在各个app文件的apps下输入

 verbose_name = '用户管理'



verbose_name = '课程管理'

在app的model下的类下输入:

    class Meta():
        # 定义表在后台管理中显示的名称
        verbose_name = verbose_name_plural = '用户表'
        另外一个app类似

显示效果:
完成中文显示
先看看课程表的展示:
在这里插入图片描述
这里售价,课程介绍等可以为空(灰色文字),我们可以再model中的对应字段加入blank=Ture;

 price = models.DecimalField(max_digits=7, decimal_places=2, default=0, verbose_name='售价',blank=True)#blank=True可以为空
    summary = models.CharField(max_length=1000, default='', verbose_name='课程介绍', blank=True)
    status = models.PositiveSmallIntegerField(default=0, verbose_name='状态', blank=True,choices=STATUS_CHOICES)# 0:收费 1:免费,默认0
    # 创建的时间默认为当前的时间
    createDatetime = models.DateTimeField(default=datetime.datetime.now(), verbose_name='创建时间', blank=True)
    # ManyToManyField,多对多定义
    userBuyer = models.ManyToManyField(to=User, related_name='userBuyer_set', verbose_name='购买用户', blank=True)
    # ManyToManyField,多对多定义

上面的能看到一些改变,比如 status = models.PositiveSmallIntegerField(default=0, verbose_name=‘状态’, blank=True,choices=STATUS_CHOICES)# 0:收费 1:免费,默认0
这里加入了choices=STATUS_CHOICES,意思是在后台显示不是0,或1,而是对应的收费,或免费,这里要定义STATUS_CHOICES:

在这个模板类下加入下面的代码:

#python对这里定义,默认元组名大写
  STATUS_CHOICES = (
        (0, '收费'),   # 元组中第一个参数存储在数据库中,第二个参数展现给用户
        (1, '免费'),
    )

继续看界面,上面有过滤等:
我们可以再admin文件下加入:

@admin.register(Course)
class CourseAdmin(admin.ModelAdmin):
    # 定义多表显示
    filter_horizontal = ['userBuyer', 'userShoppingcart']
    list_display = ['id', 'courseName', 'pCategory', 'price', 'summary', 'status', 'createDatetime']
    # 定义右侧的过滤器
    list_filter = ['status', 'createDatetime']
    search_fields = ['courseName', 'price']

保存文件,如果我们不自定义文件保存位置,文件会默认保存在根目录下,我们可以创建对应的文件夹,然后这么写:

    fileName = models.FileField(upload_to=save_file, verbose_name='文件名称')
    # ImageField类型,Admin后台管理支持图片的上传
    # upload_to定义上传文件的保存方法
    imgname = models.ImageField(upload_to=save_img, verbose_name='课程图片')

创建对应的方法:


def save_file(instance,filename):
    # 返回文件的保存路径,并把这个路径写入数据库中对应的字段中
    return os.path.join('video', filename)

def save_img(instance,filename):
    # 返回文件的保存路径,并把这个路径写入数据库中对应的字段中
    return os.path.join('static', 'img', filename)

在这里插入图片描述
如果想要这两个地方显示的时名字,而不是类别,需要在对应的model类下加入:

#Category:
 def __str__(self):
        return self.name
#user
    def __str__(self):
        return self.account

在这里插入图片描述
要想在这里显示的不是数据类型,而是我们要显示的数据,需要在对应的app文件admin中加入

#list_display[即要显示的字段]
例如:
 list_display = ['id', 'courseName', 'pCategory', 'price', 'summary', 'status', 'createDatetime']

下面的东西太TM多了,懒得弄了,搞完了,有点bug(bug地方我有有备注,不影响使用。),但是正常学习使用是没问题的。
附个链接:https://download.csdn.net/download/weixin_38950569/12270157

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值