• 21、Django实战第21天:课程章节信息


    在课程详情页中,点击"开始学习",就进入到这课程章节信息,这里面包含了两个页面:"章节"和评论

    1、把course-video.html(章节)、course-comment.html(评论)复制到templates中

    2、编辑course-video.html,继承base.html

    3、编辑courses.views.py

    class CourseInfoView(View):
        def get(self, request, course_id):
            course = Course.objects.get(id=course_id)
            return render(request, 'course-video.html', {
                'course': course,
            })

    4、编辑courses.urls.py

    ...
    from .views import  CourseInfoView
    
    
    urlpatterns = [
        ...   
        url(r'^info/(?P<course_id>d+)/$', CourseInfoView.as_view(), name='course_ino'),
    
    ]

    5、编辑course-detail.html,配置"开始学习"的链接,作为章节信息的入口

    现在我们点击学习可以进入到课程章节页面...

    第一部分:标题

    第二部分:展示章节和视频

    ①通过课程(外键关联),我们可以获取到所有章节

    class Course(models.Model):
        name = models.CharField(max_length=50, verbose_name='课程名')
        course_org = models.ForeignKey(CourseOrg, verbose_name='课程机构')
        desc = models.CharField(max_length=300, verbose_name='课程描述')
        details = models.TextField(verbose_name='课程详情')
        degree = models.CharField(verbose_name='课程难度', choices=(('cj', '初级'), ('zj', '中级'), ('gj', '高级')), max_length=2)
        learn_times = models.IntegerField(default=0, verbose_name='学习时长(分钟)')
        students = models.IntegerField(default=0, verbose_name='学习人数')
        fav_nums = models.IntegerField(default=0, verbose_name='收藏人数')
        image = models.ImageField(upload_to='courses/%Y/%m', verbose_name='封面图', max_length=100)
        click_nums = models.IntegerField(default=0, verbose_name='点击数')
        category = models.CharField(max_length=20, default='', verbose_name=u'课程类别')
        tag = models.CharField(max_length=10, default='', verbose_name=u'课程标签')
        add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
        class Meta:
            verbose_name = '课程'
            verbose_name_plural = verbose_name
    
        def get_lesson(self):
            """获取章节"""
            return self.lesson_set.all()
    
        def get_lesson_nums(self):
            """获取章节数"""
            return self.lesson_set.count()
    
        def get_learn_students(self):
            """获取3个学习用户"""
            return self.usercourse_set.all()[:3]
    
        def __str__(self):
            return self.name

    ②通过章节(外键关联),我们可以获取到所有视频

    class Lesson(models.Model):
        course = models.ForeignKey(Course, verbose_name='课程')
        name = models.CharField(max_length=100, verbose_name='章节名')
        add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
    
        class Meta:
            verbose_name = '章节'
            verbose_name_plural = verbose_name
    
        def get_video(self):
            """获取视频"""
            return self.video_set.all()
    
        def __str__(self):
            return self.name

    前端数据动态展示

    第三部分:资料下载

    ①在xadmin后台添加课程资料

    ②编辑courses.views.py

    from .models import  CourseResource
    ...
    
    
    class CourseInfoView(View):
        def get(self, request, course_id):
            course = Course.objects.get(id=course_id)
            all_resource = CourseResource.objects.filter(course=course)
    
            return render(request, 'course-video.html', {
                'course': course,
                'all_resource': all_resource,
            })  

    前端配置

    第四部分:讲师提示

    我们发现Course表里面没有讲师课程须知老师告诉你能学到什么 字段,因此我们需要添加字段,编辑courses.models.py

     

    同步数据结构到数据库

    在xadmin后天添加相关测试数据

    前端展示数据

    第五部分:该同学还学过什么(课程推荐)

     编辑courses.views.py

    ...
    from operation.models import UserCourse
    
    
    class CourseInfoView(View):
        def get(self, request, course_id):
            course = Course.objects.get(id=course_id)
            all_resource = CourseResource.objects.filter(course=course)
    
            # 该同学还学过
            user_courses = UserCourse.objects.filter(course=course) #获取“用户课程”表里面该课程的所有记录
            user_ids = [user_course.user.id for user_course in user_courses] #获取学过该课程的所有用户id
            all_user_courses = UserCourse.objects.filter(user_id__in=user_ids) #获取这些用户学过的课程记录
            course_ids = [user_course.id for user_course in all_user_courses] #获取这些课程的id
            relate_courses = Course.objects.filter(id__in=course_ids).order_by('-click_nums')[:5] #根据点击量取出5个
    
            return render(request, 'course-video.html', {
                'course': course,
                'all_resource': all_resource,
                'relate_courses': relate_courses,
    
            })

    前端动态数据展示

    课程推荐已经完成了,但是现在我们还看不到效果,因为当用户点击“开始学习后”,并没有关联到“用户课程”数据表,如果要关联到,那必须是用户是登录状态。所以,我们要实现:只有用户登录后,点击“开始学习”才会跳转到章节信息页面,并且把课程添加到“用户课程”表里面,如果没有登录,则跳转到登录页面

    ①在app/utils目录下面创建一个登录验证mixin_utils.py

    from django.contrib.auth.decorators import login_required
    from django.utils.decorators import method_decorator
    
    
    class LoginRequiredMixin(object):
    
        @method_decorator(login_required(login_url='/login/'))
        def dispatch(self, request, *args, **kwargs):
            return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)
    

     

    ②编辑courses.views.py

    ...
    from utils.mixin_utils import LoginRequiredMixin
    
    
    class CourseInfoView(LoginRequiredMixin, View):
        def get(self, request, course_id):
            course = Course.objects.get(id=course_id)
            all_resource = CourseResource.objects.filter(course=course)
            
            # 查询用户是否已经关联了该数据
            user_course = UserCourse.objects.filter(user=request.user, course=course)
            if not user_course:
                # 如果没有则写入数据库
                my_course = UserCourse(user=request.user, course=course)
                my_course.save()
    
            # 该同学还学过
            user_courses = UserCourse.objects.filter(course=course) #获取“用户课程”表里面该课程的所有记录
            user_ids = [user_course.user.id for user_course in user_courses] #获取学过该课程的所有用户id
            all_user_courses = UserCourse.objects.filter(user_id__in=user_ids) #获取这些用户学过的课程记录
            course_ids = [user_course.id for user_course in all_user_courses] #获取这些课程的id
            relate_courses = Course.objects.filter(id__in=course_ids).order_by('-click_nums')[:5] #根据点击量取出5个
    
            return render(request, 'course-video.html', {
                'course': course,
                'all_resource': all_resource,
                'relate_courses': relate_courses,
    
            })
    

      

  • 相关阅读:
    JVM总结-java基本类型
    JVM总结-虚拟机怎么执行字节码
    spring-BeanDefinition流程源码分析
    spring-BeanFactory源码解析
    linux文件基本权限-基本权限的修改
    Spring-IoC容器初始化流程源码分析
    spring-AOP
    JavaScript笔记 第十六章 匿名函数和闭包
    C# 指针(unsafe与fixed的使用)
    devenv.exe
  • 原文地址:https://www.cnblogs.com/sellsa/p/8631592.html
Copyright © 2020-2023  润新知