在课程详情页中,点击"开始学习",就进入到这课程章节信息,这里面包含了两个页面:"章节"和评论
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,
})