您现在的位置是: 网站首页 >Django >Django2.0.8+xadmin2实现在线学习网站 Django

【Django在线教育平台】11.机构收藏功能实现

admin2019年6月4日 14:04 Django | Html | JQuery 208人已围观

Django2.0.8+xadmin2实现在线学习网站简介 Django2.0.8+xadmin2实现在线学习网站,课程、讲师、机构、用户收藏功能。GitHub地址:https://github.com/xyliurui/OnlineLearningPlatform ;Django版本:2.0.8

## 机构收藏功能 ### 机构模型增加收藏数更新函数 ```python # 课程机构信息 class CourseOrg(models.Model): ORG_CHOICES = ( ("pxjg", "培训机构"), ("gx", "高校"), ("gr", "个人"), ) name = models.CharField(max_length=50, verbose_name='机构名称') desc = models.TextField(verbose_name='机构描述') category = models.CharField(choices=ORG_CHOICES, max_length=10, default='pxjg', verbose_name='机构类别') click_nums = models.IntegerField(default=0, verbose_name='点击数') fav_nums = models.IntegerField(default=0, verbose_name='收藏数') students = models.IntegerField(default=0, verbose_name='学习人数') course_nums = models.IntegerField(default=0, verbose_name='课程数') image = models.ImageField(upload_to='org/%Y/%m', max_length=100, blank=True, null=True, verbose_name='封面图') address = models.CharField(max_length=150, verbose_name='机构地址') city = models.ForeignKey(CityDict, on_delete=models.CASCADE, verbose_name='所在城市') add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间') class Meta: verbose_name_plural = verbose_name = '课程机构' def change_fav_nums(self, add=1): self.fav_nums += add self.save(update_fields=['fav_nums']) def __str__(self): return self.name ``` 用于收藏和取消收藏时值加减 ### 机构收藏ajax视图AddFavView(View) ```python # 机构收藏或取消收藏 class AddFavView(View): def post(self, request): # 收藏的不管是课程,讲师,还是机构,都是记录他们的id,如果没取到把它设置未0,避免查询时异常 fav_id = request.POST.get('fav_id', 0) # 表明收藏的类别 fav_type = request.POST.get('fav_type', 0) # 收藏与已收藏取消收藏 # 判断用户是否登录:即使没登录会有一个匿名的user if not request.user.is_authenticated: # 未登录时返回json提示未登录,跳转到登录页面是在ajax中做的 return HttpResponse('{"fav_status":"fail", "fav_msg":"用户未登录"}', content_type='application/json') exist_records = UserFavorite.objects.filter(user=request.user, fav_id=fav_id, fav_type=fav_type) if exist_records: # 如果已经存在,表明用户取消收藏 exist_records.delete() # 机构模型中存储的收藏数减1 CourseOrg.objects.get(id=fav_id).change_fav_nums(add=-1) return HttpResponse('{"fav_status":"success", "fav_msg":"添加收藏"}', content_type='application/json') else: user_fav = UserFavorite() # 如果取到了id值才进行收藏 if int(fav_id) > 0 and int(fav_type) > 0: user_fav.fav_id = fav_id user_fav.fav_type = fav_type user_fav.user = request.user user_fav.save() # 机构模型中存储的收藏数加1 CourseOrg.objects.get(id=fav_id).change_fav_nums(add=1) return HttpResponse('{"fav_status":"success", "fav_msg":"取消收藏"}', content_type='application/json') else: return HttpResponse('{"fav_status":"fail", "fav_msg":"收藏出错"}', content_type='application/json') ``` ### 收藏功能url ```python from organization.views import OrgListView, AddUserAskView, OrgHomeView, OrgCourseView, OrgDescView, OrgTeacherView, AddFavView app_name = 'organization' urlpatterns = [ # 课程机构列表url path('list/', OrgListView.as_view(), name="org_list"), path('add_ask/', AddUserAskView.as_view(), name='add_ask'), re_path('home/(?P<org_id>\d+)/', OrgHomeView.as_view(), name='org_home'), # 机构详情首页 re_path('id/(?P<org_id>\d+)/courses/', OrgCourseView.as_view(), name='org_course'), # 机构课程列表 re_path('id/(?P<org_id>\d+)/desc/', OrgDescView.as_view(), name='org_desc'), # 机构介绍 re_path('id/(?P<org_id>\d+)/teacher/', OrgTeacherView.as_view(), name='org_teacher'), # 机构讲师 path('add_fav/', AddFavView.as_view(), name="add_fav"), # 添加机构收藏 ] ``` ### 机构收藏模板按钮 监听按钮点击动作,post提交,改变按钮的样式和文字 ```html <p> {% if has_fav %} <button id="add_fav_org_button" class="btn-round btn-light" style="background: #FFA042">取消收藏</button> {% else %} <button id="add_fav_org_button" class="btn-round btn-light" style="background: #02DF82">添加收藏</button> {% endif %} </p> <script type="text/javascript"> //添加或取消收藏 function add_fav_org(current_elem, fav_id, fav_type){ $.ajax({ cache: false, type: "POST", url:"{% url 'org:add_fav' %}", data:{'fav_id':fav_id, 'fav_type':fav_type}, async: true, beforeSend:function(xhr, settings){ xhr.setRequestHeader("X-CSRFToken", "{{ csrf_token }}"); }, success: function(data) { if(data.fav_status === 'fail'){ if(data.fav_msg === '用户未登录'){ window.location.href="/login/?next={{ request.path }}"; }else{ alert(data.fav_msg) } }else if(data.fav_status === 'success'){ current_elem.text(data.fav_msg); // 修改按钮的颜色 if (data.fav_msg === '取消收藏') { document.getElementById('add_fav_org_button').style.background = '#FFA042'; } else if (data.fav_msg === '添加收藏') { document.getElementById('add_fav_org_button').style.background = '#02DF82'; } } }, }); } $('#add_fav_org_button').on('click', function(){ add_fav_org($(this), {{ course_org.id }}, 2); }); </script> ``` ![BLOG_20190604_140507_46](/media/blog/images/2019/06/BLOG_20190604_140507_46.png "博客图集BLOG_20190604_140507_46.png") ### 机构信息页面视图添加收藏状态 例如机构首页,添加`has_fav`来检测是否已收藏,且需要用户登录的,同事还需要将课程页面、讲师页面、介绍页面都添加上 ```python 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 ``` 例如 ```python # 机构首页 class OrgHomeView(View): def get(self, request, org_id): # 通过id找到机构 course_org = CourseOrg.objects.get(id=org_id) # 通过机构找到这个机构的课程和教师,并按一些数据进行排序 all_course = course_org.courses.all().order_by('-students', '-fav_nums', 'click_nums')[:4] all_teacher = course_org.teachers.all().order_by('-fav_nums', '-click_nums')[:4] # TYPE_CHOICES = ( # (1, "课程"), # (2, "课程机构"), # (3, "讲师") # ) 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 return render(request, 'org-detail-homepage.html', locals()) ``` ## 标记访问页面 可以在org中每个视图添加一个参数,用于选中激活 ```python # 标记当前页,用于页面选中active current_access_url = 'org' ``` 然后前端判断 ```html <li {% ifequal current_access_url 'org' %} class="active" {% endifequal %}><a href="{% url 'org:org_list' %}">授课机构</a></li> ```

很赞哦! (0)

文章交流

  • emoji
0人参与,0条评论

当前用户

未登录,点击   登录

站点信息

  • 建站时间:网站已运行590天
  • 系统信息:Linux
  • 后台程序:Python: 3.6.6
  • 网站框架:Django: 2.2.9
  • 文章统计:222 篇
  • 文章评论:40 条
  • 腾讯分析网站概况-腾讯分析
  • 百度统计网站概况-百度统计
  • 微信公众号:扫描二维码,关注我们
返回
顶部
标题 换行 登录
网站