在线教育项目(四)之授课机构功能实现

功能:

  1. 授课机构列表(可分页,可按类别,地区筛选,可按学习人数和课程数排序)
  2. 机构详情页(可收藏机构,有哪些课程,讲师,以及机构介绍)
  3. 可咨询课程(使用ModelForm)

 对应的url

urlpatterns = [
     #列表
    url(r'^list/', OrgView.as_view(), name='org_list'),
    #咨询
    url(r'^add_ask/', AskView.as_view(), name='add_ask'),
    url(r'^home/(?P<org_id>\d+)/$', OrgHomeView.as_view(), name='org_home'),#机构首页
    url(r'^course/(?P<org_id>\d+)/$', OrgCourseView.as_view(), name='org_course'),#机构课程
    url(r'^desc/(?P<org_id>\d+)/$', OrgDescView.as_view(), name='org_desc'),
    url(r'^org_teacher/(?P<org_id>\d+)/$', OrgTeacherView.as_view(), name='org_teacher'),

    # 收藏
    url(r'^add_fav/', AddFavView.as_view(), name='add_fav'),
]

 机构列表功能实现

实现后,返回前端页面,使用模板语言进行填充即可。

class OrgView(View):
    '''
    课程机构
    '''

    def get(self, request):
        # 所有机构
        all_orgs = CourseOrg.objects.all()
        org_nums = all_orgs.count()
        # 所有城市
        all_citys = CityDict.objects.all()

        # 搜索
        keyword = request.GET.get('keywords', '')
        if keyword:
            # i表示忽略大小写
            all_orgs = all_orgs.filter(
                Q(name__icontains=keyword) | Q(desc__icontains=keyword))

        # 类别筛选
        category = request.GET.get('ct', '')
        if category:
            all_orgs = all_orgs.filter(category=category)

        # 城市筛选
        city_id = request.GET.get('city', '')
        if city_id:
            all_orgs = all_orgs.filter(city_id=int(city_id))

        # 热门机构排名,按照点击次数降序
        hot_orgs = all_orgs.order_by('-click_nums')[:3]

        # 按照机构的学习人数或者课程数排序
        sort = request.GET.get('sort', '')
        if sort == 'students':
            all_orgs = all_orgs.order_by('-students')
        elif sort == 'courses':
            all_orgs = all_orgs.order_by('-course_nums')

        # 分页处理,每页两个
        try:
            page = request.GET.get('page', 1)
        except PageNotAnInteger:
            page = 1
        p = Paginator(all_orgs, 2, request=request)
        orgs = p.page(page)
        return render(request, 'org-list.html',
                      {
                          'all_orgs': orgs,
                          'all_citys': all_citys,
                          'org_nums': org_nums,
                          'hot_orgs': hot_orgs,
                          'category': category,
                          # 传回sort和city_id,目的是为了判断选中状态,增加active属性
                          'sort': sort,
                          'city_id': city_id,
                      })

分页的实现:

分页用了django pure_pagination 库,可去github下载https://github.com/jamespacileo/django-pure-pagination。

机构首页

在机构列表页,点击一个机构,会向后台发送一个get请求,带上这个课程的id,后台获取这个机构有哪些课程、讲师、讲师有什么课。

class OrgHomeView(View):
    def get(self, request, org_id):
        current_page = 'home'
        # 找到这个机构有哪些课程、教师、讲师有什么课
        course_org = CourseOrg.objects.get(id=int(org_id))
        has_fav = False
        #判断是否已收藏
        if request.user.is_authenticated:
            if UserFavorite.objects.filter(user=request.user, fav_id=course_org.id, fav_type=2):
                has_fav = True
        # 反向查找课程和讲师
        all_courses = course_org.course_set.all()[:4]
        all_teacher = course_org.teacher_set.all()[:2]
        return render(request, 'org-detail-home.html', {'course_org': course_org,
                                                        'all_courses': all_courses,
                                                        'all_teacher': all_teacher,
                                                        'current_page': current_page,
                                                        'has_fav': has_fav})

 咨询功能

发送ajax请求

    <script>
        //给立即咨询按钮绑定点击事件
        $('#jsStayBtn').click(function () {
            $.ajax({
                cache: false,
                url: "{% url 'org:add_ask' %}",
                type: "post",
                data: $('#jsStayForm').serialize(),//把form表单的值序列化成一个字符串
                async: true,
                success: function (data) {
                    if (data.status == 'success') {
                        $('#jsStayForm')[0].reset();
                        alert('提交成功');
                    } else if (data.status == 'fail') {
                        $('#jsCompanyTips').html(data.msg);//删除错误信息
                    }
                }
            })
        })
    </script>

后台代码:

class AskView(View):
    '''
    用户添加咨询,只有post请求
    '''

    def post(self, request):
        use_post = UserAskForm(request.POST)  # 使用ModelForm,实例化
        if use_post.is_valid():
            use_post.save(commit=True)  # 当commit为True,可以直接把提交的数据保存在数据库
            return HttpResponse('{"status":"success"}', content_type='application/json')
        else:
            return HttpResponse('{"status":"fail","msg":"添加出错"}', content_type='application/json')

机构课程、介绍、讲师功能实现:

根据机构id,分别获取对应的数据

#课程
class OrgCourseView(View): 
    def get(self, request, org_id):

        current_page = 'course'
        course_org = CourseOrg.objects.get(id=int(org_id))
        # 反向查找课程
        has_fav = False
        if request.user.is_authenticated:
            if UserFavorite.objects.filter(user=request.user, fav_id=course_org.id, fav_type=2):
                has_fav = True
        all_courses = course_org.course_set.all()[:4]
        return render(request, 'org-detail-course.html', {'course_org': course_org,
                                                          'all_courses': all_courses,
                                                          'current_page': current_page,
                                                          'has_fav': has_fav})

收藏功能实现:

收藏需要判断是否已经收藏过,如果已经收藏过,则是取消收藏。收藏分为三类,收藏教师、机构或课程。

class AddFavView(View):
    def post(self, request):
        id = request.POST.get('fav_id', 0)
        type = request.POST.get('fav_type', 0)
        if not request.user.is_authenticated:
            # 未登录
            return HttpResponse('{"status":"fail","msg":"用户未登录"}', content_type='application/json')
        exist_record = UserFavorite.objects.filter(user=request.user, fav_id=int(id), fav_type=int(type))
        if exist_record:
            # 用户已经收藏过,再点击表示取消收藏
            exist_record.delete()
            if int(type) == 1:
                course = Course.objects.get(id=int(id))
                course.fav_nums -= 1
                if course.fav_nums < 0:
                    course.fav_nums = 0
                course.save()

            elif int(type) == 2:
                teacher_obj = Teacher.objects.get(id=int(id))
                teacher_obj.fav_nums -= 1
                if teacher_obj.fav_nums < 0:
                    teacher_obj.fav_nums = 0
                teacher_obj.save()

            elif int(type) == 3:
                course = Course.objects.get(id=int(id))
                course.fav_nums -= 1
                if course.fav_nums < 0:
                    course.fav_nums = 0
                course.save()

            return HttpResponse({"status": "success", "msg": "收藏"}, content_type='application/json')
        else:
            user_fav = UserFavorite()
            if int(type) > 0 and int(id) > 0:
                user_fav.fav_id = int(id)
                user_fav.fav_type = int(type)
                user_fav.user = request.user
                user_fav.save()

                if int(type) == 1:
                    course = Course.objects.get(id=int(id))
                    course.fav_nums += 1
                    course.save()
                elif int(type) == 2:
                    org = CourseOrg.objects.get(id=int(id))
                    org.fav_nums += 1
                    org.save()
                elif int(type) == 3:
                    teacher = Teacher.objects.get(id=int(id))
                    teacher.fav_nums += 1
                    teacher.save()
                return HttpResponse({"status": "success", "msg": "已收藏"}, content_type='application/json')
            else:
                return HttpResponse({"status": "fail", "msg": "收藏出错"}, content_type='application/json')

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值