创建数据库(这里一定要注意,要加上编码合格式!!!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