24.课程模块

1.课程

1.1 在syl/apps创建应用course
python ../manage.py startapps course
1.2 在syl/settings.py 中注册应用
INSTALLED_APPS = [
    'course.apps.CourseConfig',
]
1.3 在syl/urls.py配置路由
urlpatterns = [
    path('course/', include('course.urls')),
]
1.4 在course/models.py创建模型
from django.db import models

# 基类
class Base(models.Model):
    create_time = models.TimeField(auto_now_add=True)
    update_time = models.TimeField(auto_now=True)

    class Meta:
    	#	作为基类,不生成表
        abstract = True

# 课程  类别
class CourseType(Base):
    title = models.CharField('课程类别', max_length=16)
    sequence = models.IntegerField('展示顺序', default=18)

    class Meta:
        db_table = 'tb_coursetype'
        #	在Django后台显示中文
        verbose_name_plural = '类别'

    def __str__(self):
        return self.title

# 课程  标签
class CourseTag(Base):
    title = models.CharField('课程标签', max_length=16)
    sequence = models.IntegerField('展示顺序', default=18)

    class Meta:
        db_table = 'tb_coursetag'
        verbose_name_plural = '标签'

    def __str__(self):
        return self.title

# 课程表
class Course(Base):
    STATUS = (
        ('0', '即将上线'),
        ('1', '已上线'),
        ('2', '已下线'),
    )

    title = models.CharField('课程名称', max_length=24)
    desc = models.CharField('课程描述', max_length=256)
    img = models.ImageField('课程logo', upload_to='course', null=True)
    course_type = models.ForeignKey(CourseType, verbose_name='课程类型', on_delete=models.SET_NULL, default=None, null=True)
    course_tag = models.ManyToManyField(CourseTag, verbose_name='课程标签')
    status = models.CharField('课程状态', choices=STATUS, max_length=8, default='1')
    attention = models.IntegerField('关注人数', default=0)
    learner = models.IntegerField('学习人数', default=0)

    class Meta:
        db_table = 'tb_course'
        verbose_name_plural = '课程'

    def __str__(self):
        return self.title

# 课程    章表
class Chapters(Base):
    title = models.CharField('章标题', max_length=24)
    serial_num = models.IntegerField('章序号')
    course = models.ForeignKey(Course, related_name='chapters', on_delete=models.SET_NULL, null=True)

    class Meta:
        db_table = 'tb_chapters'
        verbose_name_plural = '章'

    def __str__(self):
        return self.title

# 课程    节表
class Sections(Base):
    title = models.CharField('节标题', max_length=24)
    serial_num = models.IntegerField('节序号')
    chapters = models.ForeignKey(Chapters, related_name='sections', on_delete=models.SET_NULL, null=True)
    learn_time = models.IntegerField('学习小时', default=1)
    video = models.FileField('上传视频',upload_to='videos/%Y%m%d/',blank=True,max_length=1024)
    seq_num = models.IntegerField('序号',default=1)

    class Meta:
        db_table = 'tb_sections'
        verbose_name_plural = '节'

    def __str__(self):
        return self.title
1.5 在serializers.py序列化
from rest_framework import serializers
from course.models import *

# 类别
class CourseTypeSerializers(serializers.ModelSerializer):
    class Meta:
        model = CourseType
        fields = '__all__'


# 标签
class CourseTagSerializers(serializers.ModelSerializer):
    class Meta:
        model = CourseTag
        fields = '__all__'


# 课程
class CourseSerializers(serializers.ModelSerializer):
    class Meta:
        model = Course
        fields = '__all__'


# 节
class SectionsSerializers(serializers.ModelSerializer):
    class Meta:
        model = Sections
        fields = '__all__'


# 章
class ChaptersSerializers(serializers.ModelSerializer):
    sections = SectionsSerializers(many=True)
    class Meta:
        model = Chapters
        fields = '__all__'


# 单个课程全部的章与节
class CourseDeepSerializer(CourseSerializers):

    chapters = ChaptersSerializers(many=True)
1.6 course/views.py视图函数
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import OrderingFilter
from rest_framework import viewsets
from rest_framework.pagination import PageNumberPagination

from course.models import *
from course.serializers import *

# 分页
class PageNum(PageNumberPagination):
    page_size_query_param = 'page_size'

# 课程 类别
class CourseTypeViewSet(viewsets.ModelViewSet):
    queryset = CourseType.objects.all()
    serializer_class = CourseTypeSerializers

# 课程 标签
class CourseTagViewSet(viewsets.ModelViewSet):
    queryset = CourseTag.objects.all()
    serializer_class = CourseTagSerializers

# 课程 
class CourseViewSet(viewsets.ModelViewSet):
    queryset = Course.objects.all()
    serializer_class = CourseSerializers

    # 指定过滤方法类, 排序方法类, 一个或多个
    filter_backends = (DjangoFilterBackend, OrderingFilter)  # 同时支持过滤和排序

    #  指定过滤字段,不设置,过滤功能不起效
    ordering_fiel = ('attention', 'learner', 'id')

    # 指定过滤字段, 不设置, 过滤功能不起效
    filter_fields = ('title', 'desc', 'status', 'course_type', 'course_tag')

    # 自定义分页器   覆盖全局配置
    pagination_class = PageNum


    def get_serializer_class(self):
        if self.action == 'list':
            return CourseSerializers
        else:
            return CourseDeepSerializer


# 课程 节
class SectionsViewSet(viewsets.ModelViewSet):
    queryset = Sections.objects.all()
    serializer_class = SectionsSerializers


# 课程 章
class ChaptersViewSet(viewsets.ModelViewSet):
    queryset = Chapters.objects.all()
    serializer_class = ChaptersSerializers
1.7 在course/urls.py中配置路由
from rest_framework.routers import DefaultRouter # 导入DRF的DefaultRouter
from . import views

router = DefaultRouter() # 有根路由
router.register(r'type',views.CourseTypeViewSet) # 类别
router.register(r'tag',views.CourseTagViewSet) # 标签
router.register(r'course',views.CourseViewSet) # 课程
router.register(r'chapters',views.ChaptersViewSet) # 章
router.register(r'sections',views.SectionsViewSet) # 节

urlpatterns = [

]

urlpatterns += router.urls # 把两个路由列表相加
1.8 在course/admin.py注册后台管理
from django.contrib import admin
from .models import *
# 注册后台管理
admin.site.register(CourseType) 
admin.site.register(CourseTag)
admin.site.register(Course) 
admin.site.register(Chapters) 
admin.site.register(Sections) 

2.路径与阶段

2.1 在course/models中创建表模型
from django.db import models

# 基类
class Base(models.Model):
    create_time = models.TimeField(auto_now_add=True)
    update_time = models.TimeField(auto_now=True)

    class Meta:
        abstract = True


# 路径表
class Path(Base):
    title = models.CharField('路径名',max_length=16)
    img = models.ImageField('路径图片',upload_to='path',null=True)
    desc = models.CharField('路径描述',max_length=255)
    user = models.ManyToManyField('user.User',blank=True)

    def course_total(self):
        count = 0
        for jd in self.jieduan.all():
            count = count+ jd.course.count()
        return count

    class Meta:
        db_table = 'tb_path'
        verbose_name_plural = '路径'

    def __str__(self):
        return self.title

# 阶段表
class JieDuan(Base):
    title = models.CharField('阶段名',max_length=16)
    serial_num = models.IntegerField('阶段序号')
    path = models.ForeignKey(Path,related_name='jieduan',on_delete=models.SET_NULL,null=True)
    courses = models.ManyToManyField(Course,blank=True)

    class Meta:
        db_table = 'tb_jieduan'
        verbose_name_plural = '阶段'

    def __str__(self):
        return '%s-第%s阶段-%s' % (self.path.title,self.serial_num,self.title)
2.2 在serializers.py序列化
from rest_framework import serializers
from course.models import *

# 路径
class PathSerializers(serializers.ModelSerializer):

    class Meta:
        model = Path
        fields = '__all__'


# 阶段
class JieDuanSerializers(serializers.ModelSerializer):
    courses = CourseSerializers(many=True)
    class Meta:
        model = JieDuan
        fields = '__all__'


# 单个路径全部的阶段与课程
class PathDeepSerializer(PathSerializers):
    jieduan = JieDuanSerializers(many=True)
2.3 course/views.py视图函数
# 课程 路径
class PathViewSet(viewsets.ModelViewSet):
    queryset = Path.objects.all()
    serializer_class = PathSerializers

    def get_serializer_class(self):
        if self.action == 'list':
            return PathSerializers
        else:
            return PathDeepSerializer


# 课程 阶段
class JieDuanViewSet(viewsets.ModelViewSet):
    queryset = JieDuan.objects.all()
    serializer_class = JieDuanSerializers
2.4 在course/urls.py中配置路由
from rest_framework.routers import DefaultRouter # 导入DRF的DefaultRouter
from . import views

router = DefaultRouter() # 有根路由
router.register(r'path',views.PathViewSet) # 路径
router.register(r'jieduan',views.JieDuanViewSet) # 阶段

urlpatterns = [

]
urlpatterns += router.urls # 把两个路由列表相加
2.5 在course/admin.py注册后台管理
from django.contrib import admin
from .models import *
# 注册后台管理
admin.site.register(Path) 
admin.site.register(JieDuan)

3.增加media文件配置

3.1syl/settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
3.2syl/urls.py
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [

]

urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值