课程章节页面--讲师提示
也就是:
首先找到这部分代码:
在view中已经把这个课的课程信息传给前端了,所以直接进行数据绑定:
这里的a标签的连接是连接到教师详情页面,这个等开发完成后添加。
Teacher类和课程类是一对多的关系,所以可以使用ORM进行调用。
运行:
课程章节页面--该课同学还学过:
也就是:
首先找到这块代码:
首先我们分析:要查询学习了该课程的用户还学习哪些课程,那么就要有一个表来存储这些数据,这个表就是operations下的UserCouser类,那么就要在用户每次点击立即学习按钮也就是进入点击的课程详情页面时,把相应的课程id和user_id记录存入数据库中。
具体UserCouser类的字段:
class UserCourse(BaseModel):
user = models.ForeignKey(UserProfile, on_delete=models.CASCADE, verbose_name="用户")
course = models.ForeignKey(Course, on_delete=models.CASCADE, verbose_name="课程")
所以要在course/views.py/CourseLessonView类中:
(因为用户进入了相应的课程章节页面才能表明他确实学习了该课程,所以要在CourseLessonView类中写)
# 如果用户点击学习了该课程,那么就添加到 用户课程 的表中
#判断用户之前是否学习过该课程。
if not UserCourse.objects.filter(user=request.user,course=course): #单例模式
uscour = UserCourse() # 实例化表
uscour.user = request.user #增加用户课程表
uscour.course = course
uscour.save()
接下来要根据用户点击的课程到该表中查询数据:
所以接着要在后台view中把数据查询出来。
#学过该课的同学该学过模块
all_user = UserCourse.objects.filter(course=course) #查询学过该课的用户都有谁
user_ids = [users.user_id for users in all_user] #循环遍历这些用户,添加到数组中
# print(user_ids)
# 筛选出表中user_id在数组中的queryset对象
course_all = UserCourse.objects.filter(user_id__in=user_ids).order_by('-course__click_nums')
course_list = [] #用于存储课程列表
for icourse in course_all: #遍历queryset对象
if icourse.course_id != int(course_id) and icourse.course not in course_list:
#如果数组中遍历到当前课程,就pass掉, 如果该课程对象没有在列表中,就加入该列表
course_list.append(icourse.course)
course_list = course_list[:5]
# print(course_id)
# print(course.id)
# print(course_list)
分析:
1.首先根据用户当前课程在表中查询学过该课程的用户都有哪些。
返回若干个queryset对象。
2.接着根据这些对象再去这个表中查询这些对象学习过的课程。
具体做法:遍历queryset对象,把这些对象的user_id存到数组user_ids中,然后在表中过滤:(user_id字段在该数组中)的有哪些对象。把这些对象排序
3.根据这些对象遍历取出所有课程,加入一个列表中。但是要加入判断:
- 去除当前页面的课程
- 去重 (如果有多个用户学习了同一门课程,那么就会出现多个重复现象)
4.列表中截取前5个。(如果在刚查出来的时候截取前五个,会有重复的占位,导致最后列表中元素不到5个)
运行:
当前登录的用户id为2,
当点击id为5的课程时,
学习该课程的用户该学习了:
数据库UserCourse中:
结果分析:
学过id为5 的课程的user只有2号用户,所以查询到12345号课程,
由于当前页面的课程id为5,所以去除5,为1234
课程详情中授课机构的展示
也就是:
之前对这部分实现了一些内容,现在完善一下:
通过外键查询课程数和教师数。
根据对应课程的机构判断该机构是否金牌和是否认证,并且相应的显示图片。
部分代码:
<ul>
<li>
<span>课 程 数: {{ course.course_org.course_set.all.count }}</span>
</li>
<li>
<span>教 师 数: {{ course.course_org.teacher_set.all.count }}</span>
</li>
<li>所在地区: {{ course.course_org.address }}</li>
<li>认 证 :
{#是否认证和金牌#}
{% if course.course_org.is_auth and course.course_org.is_gold %}
<img src="{% static 'images/authentication.png' %}"/>
<img src="{% static 'images/gold.png' %}"/>
{% elif course.course_org.is_auth and not course.course_org.is_gold %}
<img src="{% static 'images/authentication.png' %}"/>
{% elif not course.course_org.is_auth and course.course_org.is_gold %}
<img src="{% static 'images/gold.png' %}"/>
{% endif %}
</li>
</ul>
运行:
相关课程推荐
也就是:
这里类似于淘宝京东等app中的猜你喜欢模块,需要人工智能进行实现。
人工智能:
这里我们采用根据课程的标签进行相关推荐。
首先找到这部分的html代码:
在courses/view.py/CourseDetailView类:
(因为这是课程详情页面的内容,所以要在CourseDetailView中写)
#相关课程推荐
#根据课程标签进行推荐
course_tag = course.tag #获取当前课程的标签
course_list = [] #用于存储课程的列表
if course_tag:
# 过滤课程标签在该标签中的课程,并去除id为当前课程的项,取前三个, 返回若干个queryset对象
course_list = Course.objects.filter(tag__contains=course.tag).exclude(id=course.id)[:3]
# print(course_list)
分析:
首先获取该课程的标签,判断这个标签是否存在,如果存在,就过滤数据库中所有课程标签包含这个标签的课程,还要去除id为当前课程的那一项。返回一个queryset对象。
在前端的页面中进行循环展示:
运行:
首先我们想让当用户点击python时,推荐下边的三个课程。
点击python:
出现三个课程:
完成