Django+xadmin打造在线教育平台(九)

总结:

1、点击量和收藏数的动态增加

(1)点击量

a、机构的点击量

当用户点击“授课机构”的时候,会进入机构列表,用户点击某个机构的时候,就会进入机构的详情页,那么用户进入机构详情页就可以认为用户点击这个机构。

这时候我们只需要在机构详情页的视图函数中,对维护的click_num做加1的操作。

def org_detail(request, org_id):
    if org_id:
        org = OrgInfo.objects.filter(id=int(org_id))[0]

        # 当用户进入到这个视图函数,那么就相当于用户点击了一下这个机构
        org.click_num += 1
        org.save()

        # 再返回页面数据的时候,需要返回收藏这个机构的状态,根据状态,让模板显示手残还是未收藏
        lovestatus = False
        if request.user.is_authenticated:  #判断用户是否登录
            love = UserLove.objects.filter(love_man=request.user, love_id=int(org_id), love_type=1, love_status=True)
            if love:
                lovestatus = True

        return render(request, 'orgs/org-detail-homepage.html',{
            'org': org,
            'detail_type': 'home',
            'lovestatus': lovestatus
        })

b、课程的点击量

同理,点击课程的详情页,我们就给课程的点击数做加1操作。

def course_detail(request, course_id):
    if course_id:
        course = CourseInfo.objects.filter(id=course_id)[0]

        course.click_num += 1
        course.save()

        relate_course = CourseInfo.objects.filter(category=course.category).exclude(id=int(course_id))[:2]

        # lovecourse和loveorg用来存储用户收藏这个东西的状态,在模板中,根据状态来确定页面加载时候显示的收藏还是取消收藏
        lovecourse = False
        loveorg = False
        if request.user.is_authenticated: # 判断用户是否登录
            # 获取用户是否收藏过课程
            love1 = UserLove.objects.filter(love_id=int(course_id), love_type=2, love_status=True, love_man=request.user)
            if love1:
                lovecourse = True
            # 获取用户是否收藏过机构
            love2 = UserLove.objects.filter(love_id=int(course.orginfo.id), love_type=1, love_status=True, love_man=request.user)
            if love2:
                loveorg = True
        return render(request, 'courses/course-detail.html', {
            'course': course,
            'relate_course': relate_course,
            'lovecourse': lovecourse,
            'loveorg': loveorg,
        })

(2)、收藏数

用户的收藏我们是用一个视图函数进行维护,那么我们要先判断用户收藏的类型,其次通过id来判断收藏的是哪个对象。然后在做加1或减1的操作。

True变False减1,False变True加1.

def user_love(request):
    love_id = request.GET.get('loveid', '')
    love_type = request.GET.get('lovetype', '')

    if love_id and love_type:
        # 根据传过来的收藏类型,判断是什么对象,根据传递过来的收藏id,判断收藏的是哪个对象
        obj = None
        if int(love_type) == 1:
            obj = OrgInfo.objects.filter(id=int(love_id))[0]

        if int(love_type) == 2:
            obj = CourseInfo.objects.filter(id=int(love_id))[0]

        if int(love_type) == 3:
            obj = TeacherInfo.objects.filter(id=int(love_id))[0]

        # 如果收藏的id和type同时存在,那么首先去收藏表中查找这个用户有没有这个收藏记录
        love = UserLove.objects.filter(love_id=love_id, love_type=int(love_type), love_man=request.user)
        if love:
            # 如果本来已经存在收藏这个东西的记录,那么需要判断收藏的状态,如果为真,代表之前收藏过,
            # 并且现在的页面上应该显示的是取消收藏,代表这一次点击是为了取消收藏
            if love[0].love_status:
                love[0].love_status = False
                love[0].save()
                obj.click_num -= 1
                obj.save()

                return JsonResponse({
                    'status': 'ok',
                    'msg': '收藏'
                })
            else:
                # 如果收藏状态为假,代表之前收藏过,并且取消了收藏,现在页面上应该显示的是收藏,这次点击是为了收藏
                love[0].love_status = True
                love[0].save()
                obj.click_num += 1
                obj.save()
                return JsonResponse({
                    'status': 'ok',
                    'msg': '取消收藏'
                })
        else:
            # 如果之前没有收藏过这个东西,代表着表中没有这条记录,需要先创建这个记录对象,然后把这个记录的状态改为True
            a = UserLove()
            a.love_man = request.user
            a.love_id = int(love_id)
            a.love_type = int(love_type)
            a.love_status = True
            a.save()
            obj.click_num += 1
            obj.save()
            return JsonResponse({
                    'status': 'ok',
                    'msg': '取消收藏'
                })
    else:
        return JsonResponse({
            'status': 'fail',
            'msg': '收藏失败'
        })

2、课程学习人数和机构学习人数的动态改变

当用户点击我要学习会跳转到course_video页面,那么我们就在对应的视图函数中来实现课程学习人数的动态改变,视图函数def course_video(request, course_id)中,判断了用户是否学习过这个课程,那么我们可以直接在后面追加学习人数

机构学习人数,我们根据用户学习的所有课程,找到对应的机构,然后对机构的学习人数做加1操作。

def course_video(request, course_id):
    if course_id:
        course = CourseInfo.objects.filter(id=course_id)[0]
        # 当用户点击开始学习以后,代表这个用户学习了这个课程,我们需要去判断用户的学习表里是否有这个课程,如果没有责需要把这个课程加到用户学习表里。
        usercourse_list = UserCourse.objects.filter(study_man=request.user, study_course=course)
        if not usercourse_list:
            a = UserCourse()
            a.study_man = request.user
            a.study_course = course
            a.save()

            course.study_num += 1  # 课程加1
            course.save()

            # 1、从学习课程的表中查找当前这个人学习的所有课程
            usercourse_list = UserCourse.objects.filter(study_man=request.user)
            course_list = [usercourse.study_course for usercourse in usercourse_list]

            # 2、 根据拿到的所有课程,找到每个课程的机构
            org_list = list(set([course.orginfo for course in course_list]))

            if course.orginfo not in org_list:
                course.orginfo.study_num += 1
                course.orginfo.save()

        # 学过该课程的同学还学过什么
        # 1、从中间表用户课程表当中找到学过该课的所有对象
        usercourse_list = UserCourse.objects.filter(study_course=course)
        # 2、根据找到的用户学习课程列表,遍历拿到所有学习过这门课的用户列表
        user_list =[usercourse.study_man for usercourse in usercourse_list]
        # 3、再根据找到的用户,从中间用户学习课程表中,找到所有用户学习其他课程的整个对象
        usercourse_list = UserCourse.objects.filter(study_man__in=user_list).exclude(study_course=course)
        # 4、从获取到的用户课程列表中,拿到我们需要的其他课程(去重)
        course_list = list(set([usercourse.study_course for usercourse in usercourse_list]))

        return render(request, 'courses/course-video.html', {
            'course': course,
            'course_list': course_list,
        })

 

上一篇:Python要素一:数据类型


下一篇:python的输出