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, })
每天进步一点,加油!