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,

        })

  

原文地址:https://www.cnblogs.com/sellsa/p/8631592.html