目录

在线教育平台(一)      在线教育平台(二)

在线教育平台(三)      在线教育平台(四)

在线教育平台(五)      在线教育平台(六)

在线教育平台(七)      在线教育平台(八)

在线教育平台(九)      在线教育平台(十)

代码

github下载

在线演示

教程

学习自慕课网-使用python3.x与Django2.0.1开发的在线教育平台

一、前言

开发环境:

    python:  3.6.4

    Django: 2.0.2

后台管理:xadmin

1.1.项目介绍

系统概括:

  • 系统具有完整的用户登录注册以及找回密码功能,拥有完整个人中心。
  • 个人中心: 修改头像,修改密码,修改邮箱,可以看到我的课程以及我的收藏。可以删除收藏,我的消息。
  • 导航栏: 公开课,授课讲师,授课机构,全局搜索。
  • 点击公开课–> 课程列表,排序-搜索。热门课程推荐,课程的分页。
  • 点击课程–> 课程详情页中对课程进行收藏,取消收藏。富文本展示课程内容。
  • 点击开始学习–> 课程的章节信息,课程的评论信息。课程资源的下载链接。
  • 点击授课讲师–>授课讲师列表页,对讲师进行人气排序以及分页,右边有讲师排行榜。
  • 点击讲师的详情页面–> 对讲师进行收藏和分享,以及讲师的全部课程。
  • 导航栏: 授课机构有分页,排序筛选功能。
  • 机构列表页右侧有快速提交我要学习的表单。
  • 点击机构–> 左侧:机构首页,机构课程,机构介绍,机构讲师。
  • 后台管理系统可以切换主题。左侧每一个功能都有列表显示, 增删改查,筛选功能。
  • 课程列表页可以对不同字段进行排序。选择多条记录进行删除操作。
  • 课程列表页:过滤器->选择字段范围等,搜索,导出csv,xml,json。
  • 课程新增页面上传图片,富文本的编辑。时间选择,添加章节,添加课程资源。
  • 日志记录:记录后台人员的操作

1.2.创建工程

创建工程

  1. django-admin startproject MxOnline

然后开始项目的开发

二、models设计

项目的开发都是从models设计开始,后台的管理和前端的渲染无非就是对数据库的增删改查,所以models设计的好坏对整个项目的开发起着至关重要的因素。

下面是我画的图,可以很直观的看出来我们需要的models。

放大显示:

创建四个app

  1. python manage.py startapp users
  2.  
  3. python manage.py startapp course
  4.  
  5. python manage.py startapp organization
  6.  
  7. python manage.py startapp operation

然后分别设计每个app的models

2.1.users 用户

自定义userProfile

系统自动生成的user表如下:

  • id: 主键, password 密码, last_login Django自动记录用户最后登录时间,。
  • is_superuser 表明用户是否是超级用户(后台管理会用到)。
  • username 用户名字段不要随便改动, email 邮箱,
  • is_staff 表示是否是员工(后台管理会用到)。
  • is_active 用户是否是激活状态, date_joined 注册时间。

我们要扩展user表,添加需要的字段

个人中心页面信息:

users/models.py添加代码:

  1. # users/models.py
  2.  
  3. from django.db import models
  4. from django.contrib.auth.models import AbstractUser
  5.  
  6. class UserProfile(AbstractUser):
  7.  
  8. gender_choices = (
  9. ('male','男'),
  10. ('female','女')
  11. )
  12.  
  13. nick_name = models.CharField('昵称',max_length=50,default='')
  14. birthday = models.DateField('生日',null=True,blank=True)
  15. gender = models.CharField('性别',max_length=10,choices=gender_choices,default='female')
  16. adress = models.CharField('地址',max_length=100,default='')
  17. mobile = models.CharField('手机号',max_length=11,null=True,blank=True)
  18. image = models.ImageField(upload_to='image/%Y%m',default='image/default.png',max_length=100)
  19.  
  20. class Meta:
  21. verbose_name = '用户信息'
  22. verbose_name_plural = verbose_name
  23.  
  24. def __str__(self):
  25. return self.username

然后做下面的一些设置

因为Image字段需要用到pillow所以需要安装该库

  1. pip install pillow

注册app

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'users'
  9. ]

重载AUTH_USER_MODEL

  1. AUTH_USER_MODEL = 'users.UserProfile'

设计数据库为Mysql

  1. # DATABASES = {
  2. # 'default': {
  3. # 'ENGINE': 'django.db.backends.sqlite3',
  4. # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  5. # }
  6. # }
  7.  
  8. DATABASES = {
  9. 'default': {
  10. 'ENGINE': 'django.db.backends.mysql',
  11. 'NAME': 'mxonline', #数据库名字
  12. 'USER': 'root', #账号
  13. 'PASSWORD': '', #密码
  14. 'HOST': '127.0.0.1', #IP
  15. 'PORT': '', #端口
  16. }
  17. }

init.py里面导入pymysql模块

  1. # user/__init__.py
  2.  
  3. import pymysql
  4. pymysql.install_as_MySQLdb()

迁移数据库

  1. python manage.py makemigrations
  2.  
  3. python manage.py migrate

user中还需要添加的表(这些功能比较独立):

  • EmailVerifyRecord - 邮箱验证码
  • Banner - 轮播图

EmailVerifyRecord   验证码

代码如下:

  1. class EmailVerifyRecord(models.Model):
  2. send_choices = (
  3. ('register','注册'),
  4. ('forget','找回密码')
  5. )
  6.  
  7. code = models.CharField('验证码',max_length=20)
  8. email = models.EmailField('邮箱',max_length=50)
  9. send_type = models.CharField(choices=send_choices,max_length=10)
  10. send_time = models.DateTimeField(default=datetime.now)
  11.  
  12. class Meta:
  13. verbose_name = '邮箱验证码'
  14. verbose_name_plural = verbose_name

Banner   轮播图

代码如下:

  1. class Banner(models.Model):
  2. title = models.CharField('标题',max_length=100)
  3. image = models.ImageField('轮播图',upload_to='banner/%Y%m',max_length=100)
  4. url = models.URLField('访问地址',max_length=200)
  5. index = models.IntegerField('顺序',default=100)
  6. add_time = models.DateTimeField('添加时间',default=datetime.now)
  7.  
  8. class Meta:
  9. verbose_name = '轮播图'
  10. verbose_name_plural = verbose_name

说明:

  image上传到哪里

url是图片的路径

index控制轮播图的播放顺序

这样users的三张表就创建完了

写代码要根据PEP8规范

每个class之间要空两格

2.2.Course 课程

课程app中需要四张表

  • Course  课程表
  • Lesson  章节信息
  • Video    视频
  • CourseResource  课程资源

(1)Course  课程表

代码如下:

  1. from datetime import datetime
  2.  
  3. from django.db import models
  4.  
  5. class Course(models.Model):
  6. DEGREE_CHOICES = (
  7. ("cj", "初级"),
  8. ("zj", "中级"),
  9. ("gj", "高级")
  10. )
  11. name = models.CharField("课程名",max_length=50)
  12. desc = models.CharField("课程描述",max_length=300)
  13. detail = models.TextField("课程详情")
  14. degree = models.CharField('难度',choices=DEGREE_CHOICES, max_length=2)
  15. learn_times = models.IntegerField("学习时长(分钟数)",default=0)
  16. students = models.IntegerField("学习人数",default=0)
  17. fav_nums = models.IntegerField("收藏人数",default=0)
  18. image = models.ImageField("封面图",upload_to="courses/%Y/%m",max_length=100)
  19. click_nums = models.IntegerField("点击数",default=0)
  20. add_time = models.DateTimeField("添加时间",default=datetime.now,)
  21.  
  22. class Meta:
  23. verbose_name = "课程"
  24. verbose_name_plural = verbose_name
  25.  
  26. def __str__(self):
  27. return self.name

(2)Lesson 章节信息表

代码如下:

  1. class Lesson(models.Model):
  2. course = models.ForeignKey(Course,verbose_name='课程',on_delete=models.CASCADE)
  3. name = models.CharField("章节名",max_length=100)
  4. add_time = models.DateTimeField("添加时间",default=datetime.now)
  5.  
  6. class Meta:
  7. verbose_name = "章节"
  8. verbose_name_plural = verbose_name
  9.  
  10. def __str__(self):
  11. return '《{0}》课程的章节 >> {1}'.format(self.course, self.name)

(3)Video 视频

代码如下:

  1. class Video(models.Model):
  2. lesson = models.ForeignKey(Lesson, verbose_name="章节",on_delete=models.CASCADE)
  3. name = models.CharField("视频名",max_length=100)
  4. add_time = models.DateTimeField("添加时间", default=datetime.now)
  5.  
  6. class Meta:
  7. verbose_name = "视频"
  8. verbose_name_plural = verbose_name

(4)CourseResourse  课程资源

  1. class CourseResource(models.Model):
  2. course = models.ForeignKey(Course, verbose_name="课程",on_delete=models.CASCADE)
  3. name = models.CharField("名称",max_length=100)
  4. download = models.FileField("资源文件",upload_to="course/resource/%Y/%m",max_length=100)
  5. add_time = models.DateTimeField("添加时间", default=datetime.now)
  6.  
  7. class Meta:
  8. verbose_name = "课程资源"
  9. verbose_name_plural = verbose_name

2.3.organization 机构

总共三张表

  • CourseOrg  课程机构基本信息
  • Teacher       教师基本信息
  • CityDict        城市信息

(1)CourseOrg

代码如下:

  1. class CourseOrg(models.Model):
  2. name = models.CharField('机构名称',max_length=50)
  3. desc = models.TextField('机构描述')
  4. click_nums = models.IntegerField('点击数',default=0)
  5. fav_nums = models.IntegerField('收藏数',default=0)
  6. image = models.ImageField('封面图',upload_to='org/%Y%m',max_length=100)
  7. address = models.CharField('机构地址',max_length=150,)
  8. city = models.ForeignKey(CityDict,verbose_name='所在城市',on_delete=models.CASCADE)
  9. add_time = models.DateTimeField(default=datetime.now)
  10.  
  11. class Meta:
  12. verbose_name = '课程机构'
  13. verbose_name_plural = verbose_name

(2)CityDict

代码如下:

  1. class CityDict(models.Model):
  2. name = models.CharField('城市',max_length=20)
  3. desc = models.CharField('描述',max_length=200)
  4. add_time = models.DateTimeField(default=datetime.now)
  5.  
  6. class Meta:
  7. verbose_name = '城市'
  8. verbose_name_plural= verbose_name

(3)Teacher

代码如下:

  1. class Teacher(models.Model):
  2. org = models.ForeignKey(CourseOrg,verbose_name='所属机构',on_delete=models.CASCADE)
  3. name = models.CharField('教师名',max_length=50)
  4. work_years = models.IntegerField('工作年限',default=0)
  5. work_company = models.CharField('就职公司',max_length=50)
  6. work_position = models.CharField('公司职位',max_length=50)
  7. points = models.CharField('教学特点',max_length=50)
  8. click_nums = models.IntegerField('点击数',default=0)
  9. fav_nums = models.IntegerField('收藏数',default=0)
  10. add_time = models.DateTimeField(default=datetime.now)
  11.  
  12. class Meta:
  13. verbose_name = '教师'
  14. verbose_name_plural = verbose_name
  15.  
  16. def __str__(self):
  17. return "[{0}]的教师: {1}".format(self.org, self.name)

2.4.operation

总共五张表

  • UseAsk 用户咨询
  • UserMessage  用户消息表
  • CourseComments 用户评论
  • UserCourse 用户学习的课程
  • UserFavorite 用户收藏

(1)UserAsk

代码如下:

  1. class UserAsk(models.Model):
  2. name = models.CharField('姓名',max_length=20)
  3. mobile = models.CharField('手机',max_length=11)
  4. course_name = models.CharField('课程名',max_length=50)
  5. add_time = models.DateTimeField('添加时间',default=datetime.now)
  6.  
  7. class Meta:
  8. verbose_name = '用户咨询'
  9. verbose_name_plural = verbose_name
  10.  
  11. def __str__(self):
  12. return self.name

(2)UserMessage

user字段,默认0代表消息是发给所有用户,而不是某个单独的用户;可以通过user.id发给特定用户消息

  1. class UserMessage(models.Model):
  2. user = models.IntegerField('接受用户',default=0)
  3. message = models.CharField('消息内容',max_length=500)
  4. has_read = models.BooleanField('是否已读',default=False)
  5. add_time = models.DateTimeField('添加时间', default=datetime.now)
  6.  
  7. class Meta:
  8. verbose_name = '用户消息'
  9. verbose_name_plural = verbose_name

(3)CourseComments

代码如下:

  1. class CourseComments(models.Model):
  2. user = models.ForeignKey(UserProfile,verbose_name='用户',on_delete=models.CASCADE)
  3. course = models.ForeignKey(Course,verbose_name='课程',on_delete=models.CASCADE)
  4. comments = models.CharField('评论',max_length=200)
  5. add_time = models.DateTimeField('添加时间', default=datetime.now)
  6.  
  7. class Meta:
  8. verbose_name = '课程评论'
  9. verbose_name_plural = verbose_name

(4)UserCourse

代码如下:

  1. class UserCourse(models.Model):
  2. user = models.ForeignKey(UserProfile,verbose_name='用户',on_delete=models.CASCADE)
  3. course = models.ForeignKey(Course,verbose_name='课程',on_delete=models.CASCADE)
  4. add_time = models.DateTimeField('添加时间', default=datetime.now)
  5.  
  6. class Meta:
  7. verbose_name = '用户课程'
  8. verbose_name_plural = verbose_name

(5)UserFavorite

代码如下:

  1. class UserFavorite(models.Model):
  2. FAV_TYPE = (
  3. (1,'课程'),
  4. (2,'课程机构'),
  5. (3,'讲师')
  6. )
  7.  
  8. user = models.ForeignKey(UserProfile,verbose_name='用户',on_delete=models.CASCADE)
  9. fav_id = models.IntegerField('数据id',default=0)
  10. fav_type = models.IntegerField(verbose_name='收藏类型',choices=FAV_TYPE,default=1)
  11. add_time = models.DateTimeField('添加时间', default=datetime.now)
  12.  
  13. class Meta:
  14. verbose_name = '用户收藏'
  15. verbose_name_plural = verbose_name

上面所有models的完整代码如下:

  1. # users/models.py
  2.  
  3. from datetime import datetime
  4.  
  5. from django.db import models
  6. from django.contrib.auth.models import AbstractUser
  7.  
  8. class UserProfile(AbstractUser):
  9.  
  10. gender_choices = (
  11. ('male','男'),
  12. ('female','女')
  13. )
  14.  
  15. nick_name = models.CharField('昵称',max_length=50,default='')
  16. birthday = models.DateField('生日',null=True,blank=True)
  17. gender = models.CharField('性别',max_length=10,choices=gender_choices,default='female')
  18. adress = models.CharField('地址',max_length=100,default='')
  19. mobile = models.CharField('手机号',max_length=11,null=True,blank=True)
  20. image = models.ImageField(upload_to='image/%Y%m',default='image/default.png',max_length=100)
  21.  
  22. class Meta:
  23. verbose_name = '用户信息'
  24. verbose_name_plural = verbose_name
  25.  
  26. def __str__(self):
  27. return self.username
  28.  
  29. class EmailVerifyRecord(models.Model):
  30. send_choices = (
  31. ('register','注册'),
  32. ('forget','找回密码')
  33. )
  34.  
  35. code = models.CharField('验证码',max_length=20)
  36. email = models.EmailField('邮箱',max_length=50)
  37. send_type = models.CharField(choices=send_choices,max_length=10)
  38. send_time = models.DateTimeField(default=datetime.now)
  39.  
  40. class Meta:
  41. verbose_name = '邮箱验证码'
  42. verbose_name_plural = verbose_name
  43.  
  44. class Banner(models.Model):
  45. title = models.CharField('标题',max_length=100)
  46. image = models.ImageField('轮播图',upload_to='banner/%Y%m',max_length=100)
  47. url = models.URLField('访问地址',max_length=200)
  48. index = models.IntegerField('顺序',default=100)
  49. add_time = models.DateTimeField('添加时间',default=datetime.now)
  50.  
  51. class Meta:
  52. verbose_name = '轮播图'
  53. verbose_name_plural = verbose_name

users/models.py

  1. # course/models.py
  2.  
  3. from datetime import datetime
  4.  
  5. from django.db import models
  6.  
  7. class Course(models.Model):
  8. DEGREE_CHOICES = (
  9. ("cj", "初级"),
  10. ("zj", "中级"),
  11. ("gj", "高级")
  12. )
  13. name = models.CharField("课程名",max_length=50)
  14. desc = models.CharField("课程描述",max_length=300)
  15. detail = models.TextField("课程详情")
  16. degree = models.CharField('难度',choices=DEGREE_CHOICES, max_length=2)
  17. learn_times = models.IntegerField("学习时长(分钟数)",default=0)
  18. students = models.IntegerField("学习人数",default=0)
  19. fav_nums = models.IntegerField("收藏人数",default=0)
  20. image = models.ImageField("封面图",upload_to="courses/%Y/%m",max_length=100)
  21. click_nums = models.IntegerField("点击数",default=0)
  22. add_time = models.DateTimeField("添加时间",default=datetime.now,)
  23.  
  24. class Meta:
  25. verbose_name = "课程"
  26. verbose_name_plural = verbose_name
  27.  
  28. def __str__(self):
  29. return self.name
  30.  
  31. class Lesson(models.Model):
  32. course = models.ForeignKey(Course,verbose_name='课程',on_delete=models.CASCADE)
  33. name = models.CharField("章节名",max_length=100)
  34. add_time = models.DateTimeField("添加时间",default=datetime.now)
  35.  
  36. class Meta:
  37. verbose_name = "章节"
  38. verbose_name_plural = verbose_name
  39.  
  40. def __str__(self):
  41. return '《{0}》课程的章节 >> {1}'.format(self.course, self.name)
  42.  
  43. class Video(models.Model):
  44. lesson = models.ForeignKey(Lesson, verbose_name="章节",on_delete=models.CASCADE)
  45. name = models.CharField("视频名",max_length=100)
  46. add_time = models.DateTimeField("添加时间", default=datetime.now)
  47.  
  48. class Meta:
  49. verbose_name = "视频"
  50. verbose_name_plural = verbose_name
  51.  
  52. class CourseResource(models.Model):
  53. course = models.ForeignKey(Course, verbose_name="课程",on_delete=models.CASCADE)
  54. name = models.CharField("名称",max_length=100)
  55. download = models.FileField("资源文件",upload_to="course/resource/%Y/%m",max_length=100)
  56. add_time = models.DateTimeField("添加时间", default=datetime.now)
  57.  
  58. class Meta:
  59. verbose_name = "课程资源"
  60. verbose_name_plural = verbose_name

course/models.py

  1. # operation/models.py
  2.  
  3. from datetime import datetime
  4.  
  5. from django.db import models
  6.  
  7. from course.models import Course
  8. from users.models import UserProfile
  9.  
  10. class UserAsk(models.Model):
  11. name = models.CharField('姓名',max_length=20)
  12. mobile = models.CharField('手机',max_length=11)
  13. course_name = models.CharField('课程名',max_length=50)
  14. add_time = models.DateTimeField('添加时间',default=datetime.now)
  15.  
  16. class Meta:
  17. verbose_name = '用户咨询'
  18. verbose_name_plural = verbose_name
  19.  
  20. def __str__(self):
  21. return self.name
  22.  
  23. class CourseComments(models.Model):
  24. user = models.ForeignKey(UserProfile,verbose_name='用户',on_delete=models.CASCADE)
  25. course = models.ForeignKey(Course,verbose_name='课程',on_delete=models.CASCADE)
  26. comments = models.CharField('评论',max_length=200)
  27. add_time = models.DateTimeField('添加时间', default=datetime.now)
  28.  
  29. class Meta:
  30. verbose_name = '课程评论'
  31. verbose_name_plural = verbose_name
  32.  
  33. class UserFavorite(models.Model):
  34. FAV_TYPE = (
  35. (1,'课程'),
  36. (2,'课程机构'),
  37. (3,'讲师')
  38. )
  39.  
  40. user = models.ForeignKey(UserProfile,verbose_name='用户',on_delete=models.CASCADE)
  41. fav_id = models.IntegerField('数据id',default=0)
  42. fav_type = models.IntegerField(verbose_name='收藏类型',choices=FAV_TYPE,default=1)
  43. add_time = models.DateTimeField('添加时间', default=datetime.now)
  44.  
  45. class Meta:
  46. verbose_name = '用户收藏'
  47. verbose_name_plural = verbose_name
  48.  
  49. class UserMessage(models.Model):
  50. user = models.IntegerField('接受用户',default=0)
  51. message = models.CharField('消息内容',max_length=500)
  52. has_read = models.BooleanField('是否已读',default=False)
  53. add_time = models.DateTimeField('添加时间', default=datetime.now)
  54.  
  55. class Meta:
  56. verbose_name = '用户消息'
  57. verbose_name_plural = verbose_name
  58.  
  59. class UserCourse(models.Model):
  60. user = models.ForeignKey(UserProfile,verbose_name='用户',on_delete=models.CASCADE)
  61. course = models.ForeignKey(Course,verbose_name='课程',on_delete=models.CASCADE)
  62. add_time = models.DateTimeField('添加时间', default=datetime.now)
  63.  
  64. class Meta:
  65. verbose_name = '用户课程'
  66. verbose_name_plural = verbose_name

operations/models.py

  1. # organization/models.py
  2.  
  3. from datetime import datetime
  4.  
  5. from django.db import models
  6.  
  7. class CityDict(models.Model):
  8. name = models.CharField('城市',max_length=20)
  9. desc = models.CharField('描述',max_length=200)
  10. add_time = models.DateTimeField(default=datetime.now)
  11.  
  12. class Meta:
  13. verbose_name = '城市'
  14. verbose_name_plural= verbose_name
  15.  
  16. class CourseOrg(models.Model):
  17. name = models.CharField('机构名称',max_length=50)
  18. desc = models.TextField('机构描述')
  19. click_nums = models.IntegerField('点击数',default=0)
  20. fav_nums = models.IntegerField('收藏数',default=0)
  21. image = models.ImageField('封面图',upload_to='org/%Y%m',max_length=100)
  22. address = models.CharField('机构地址',max_length=150,)
  23. city = models.ForeignKey(CityDict,verbose_name='所在城市',on_delete=models.CASCADE)
  24. add_time = models.DateTimeField(default=datetime.now)
  25.  
  26. class Meta:
  27. verbose_name = '课程机构'
  28. verbose_name_plural = verbose_name
  29.  
  30. class Teacher(models.Model):
  31. org = models.ForeignKey(CourseOrg,verbose_name='所属机构',on_delete=models.CASCADE)
  32. name = models.CharField('教师名',max_length=50)
  33. work_years = models.IntegerField('工作年限',default=0)
  34. work_company = models.CharField('就职公司',max_length=50)
  35. work_position = models.CharField('公司职位',max_length=50)
  36. points = models.CharField('教学特点',max_length=50)
  37. click_nums = models.IntegerField('点击数',default=0)
  38. fav_nums = models.IntegerField('收藏数',default=0)
  39. add_time = models.DateTimeField(default=datetime.now)
  40.  
  41. class Meta:
  42. verbose_name = '教师'
  43. verbose_name_plural = verbose_name
  44.  
  45. def __str__(self):
  46. return "[{0}]的教师: {1}".format(self.org, self.name)

organization/models.py

创建完models后一定要把所有的apps添加到settings的“INSTALLED_APPS”里面

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'users',
  9. 'course',
  10. 'organization',
  11. 'operation',
  12. ]

迁移到数据库

  1. python manage.py makemigrations
  2.  
  3. python manage.py migrate

2.5.把四个app放到一个文件夹

创建package: apps

把之前的四个app全部剪切到apps包里面

 不要选“Search for references”

去掉searchfor的勾选。拖进去之后会报错,说找不到那些import的模块了。

解决方案:右键MarksourceRoot。根目录下找不到的,会去apps下搜索。

但是这时候cmd下还是会报错。需要在settings设置

插入第0是希望它先搜索我们app下东西:

  1. import os
  2. import sys
  3. # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
  4. BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  5. sys.path.insert(0,os.path.join(BASE_DIR,'apps'))

再运行就可以成功启动了

此时的目录

下一篇Django+xadmin打造在线教育平台(二)

在线教育平台搭建 预览和models的更多相关文章

  1. 第三百八十节,Django+Xadmin打造上线标准的在线教育平台—将所有app下的models数据库表注册到xadmin后台管理

    第三百八十节,Django+Xadmin打造上线标准的在线教育平台—将所有app下的models数据库表注册到xadmin后台管理 将一个app下的models数据库表注册到xadmin后台管理 重点 ...

  2. 第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表、课程评论表、用户收藏表、用户消息表、用户学习表

    第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表.课程评论表.用户收藏表.用户消息表.用户学习表 创建名称为ap ...

  3. 第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表、课程机构表、讲师表

    第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表.课程机构表.讲师表 创建名称为app_organization的课 ...

  4. 第三百七十四节,Django+Xadmin打造上线标准的在线教育平台—创建课程app,在models.py文件生成4张表,课程表、课程章节表、课程视频表、课程资源表

    第三百七十四节,Django+Xadmin打造上线标准的在线教育平台—创建课程app,在models.py文件生成4张表,课程表.课程章节表.课程视频表.课程资源表 创建名称为app_courses的 ...

  5. 第三百七十三节,Django+Xadmin打造上线标准的在线教育平台—创建用户app,在models.py文件生成3张表,用户表、验证码表、轮播图表

    第三百七十三节,Django+Xadmin打造上线标准的在线教育平台—创建用户app,在models.py文件生成3张表,用户表.验证码表.轮播图表 创建Django项目 项目 settings.py ...

  6. 第三百九十六节,Django+Xadmin打造上线标准的在线教育平台—其他插件使用说,自定义列表页上传插件

    第三百九十六节,Django+Xadmin打造上线标准的在线教育平台—其他插件使用说,自定义列表页上传插件 设置后台列表页面字段统计 在当前APP里的adminx.py文件里的数据表管理器里设置 ag ...

  7. Django+xadmin打造在线教育平台(六)

    九.课程章节信息 9.1.模板和urls 拷贝course-comments.html 和 course-video.html放入 templates目录下 先改course-video.html,同 ...

  8. Django+xadmin打造在线教育平台(二)

    三.xadmin后台管理 3.1.xadmin的安装 django2.0的安装(源码安装方式): https://github.com/sshwsfc/xadmin/tree/django2 把zip ...

  9. Django+xadmin打造在线教育平台(三)

    五.完成注册.找回密码和激活验证码功能 5.1.用户注册 register.html拷贝到templates目录 (1)users/views.py class RegisterView(View): ...

随机推荐

  1. keras初涉笔记【一】

    安装keras依赖的库 sudo pip install numpy sudo pip install scipy sudo pip installl pyyaml sudo pipi install ...

  2. MysqL读写分离的实现-Mysql proxy中间件的使用

    为什么要架设读写分离,这里不做多余的说明,想了解具体原理,请百度或者参考其他帖子.在这里只做大概的配置说明,测试中使用三台服务器 192.168.136.142   主服务器 192.168.136. ...

  3. qml 静态编译程序执行错误 无法定位程序输入点 CreateDXGIFactory2 于动态链接库 dxgi.dll 上

    重新编译 qt 静态库即可,或 删除该动态库. -no-feature-d3d12 解决方案请参考如下网址: https://forum.qt.io/topic/78380/entry-point-n ...

  4. python语言基础语法笔记<note2--面向对象编程>

    Python面向对象编程(OOP) 一.面向对象过程的优点特征: 封装 模型的特征和能力打包在一起 模型的改变由模型自身完成 隐藏模型的细节,外界只能使用,不能改变 继承 符合自然界分类规律 快速实现 ...

  5. 看eShopOnContainers学一个EventBus

    最近在看微软eShopOnContainers 项目,看到EventBus觉得不错,和大家分享一下 看完此文你将获得什么? eShop中是如何设计事件总线的 实现一个InMemory事件总线eShop ...

  6. MySQL SQL语句分析查询优化

    如何获取有性能问题的SQL 1.通过用户反馈获取存在性能问题的SQL 2.通过慢查询日志获取性能问题的SQL 3.实时获取存在性能问题的SQL 使用慢查询日志获取有性能问题的SQL 首先介绍下慢查询相 ...

  7. Hadoop压缩

    为什幺要压缩? 压缩会提高计算速度?这是因为mapreduce计算会将数据文件分散拷贝到所有datanode上,压缩可以减少数据浪费在带宽上的时间,当这些时间大于压缩/解压缩本身的时间时,计算速度就会 ...

  8. 微信小程序--TabBar不出现的一种原因

    转自 http://blog.csdn.net/yedouble/article/details/54089825 pages数组的第一项必须是tabBar的list数组的一员. quedian无法返 ...

  9. HighGUI图形图像界面初步—— 图像的载入、显示与输出

    HighGUI模块为高层GUI图形用户界面模块,包含媒体的输入输出.视频捕捉.图像和视频的编解码.图形交互界面的接口等. 在本章中,我们将学到: 图像的载入.显示和输出到文件的详细分析 滑动条的创建和 ...

  10. 对HI3531的GPIO使用的再分析

    在一个嵌入式系统中使用最多的莫过于 通用输入输出 GPIO口.看到论坛中经常有朋友问海思为什么没有提供GPIO驱动.其实不然. 在海思SDK  xxx/osdrv/tools/board_tools/ ...