九、机构首页功能
1、机构首页页面
1.1 前端页面配置
将机构首页页面org-detail-homepage.html拷贝到templates下。
机构首页、机构描述、机构教师、机构课程四个页面的结构大体相同,可以创建一个母版,这个个页面继承这个母版即可,在templates下新建org_base.html,将org-detail-homepage.html的内容拷贝到org_base.html,找出需要block的地方和修改静态文件路径:
然后将需要继承的部分拷贝到org-detail-homepage.html下:
1.2 机构首页接口
我们需要获取机构有哪些课程,需要在课程的model中添加一个机构的外键,course/models.py:
1 class Course(models.Model): 2 """课程""" 3 DEGREE_CHOICES = ( 4 (\'cj\', \'初级\'), 5 (\'zj\', \'中级\'), 6 (\'gj\', \'高级\') 7 ) 8 9 name = models.CharField(\'课程名\', max_length=50) 10 desc = models.CharField(\'课程描述\', max_length=300) 11 detail = models.TextField(\'课程详情\') 12 degree = models.CharField(\'课程难度\', choices=DEGREE_CHOICES, max_length=2) 13 learn_times = models.IntegerField(\'学习时长(分钟数)\', default=0) 14 students = models.IntegerField(\'学习人数\', default=0) 15 fav_nums = models.IntegerField(\'收藏人数\', default=0) 16 click_nums = models.IntegerField(\'点击数\', default=0) 17 image = models.ImageField(\'封面图\', upload_to=\'courses/%Y/%m\', max_length=100) 18 course_org = models.ForeignKey(CourseOrg, verbose_name=\'所属机构\', on_delete=models.CASCADE, null=True, blank=True) 19 add_time = models.DateTimeField(\'添加时间\', default=datetime.now) 20 21 class Meta: 22 verbose_name = \'课程\' 23 verbose_name_plural = verbose_name 24 25 def __str__(self): 26 return self.name
必须迁移数据库。
然后开始编写机构首页的接口:
1 class OrgHomeView(View): 2 """机构主页""" 3 def get(self, request, org_id): 4 # 根据前端的id找机构 5 org = CourseOrg.objects.get(id=int(org_id)) 6 7 # 反向查询机构所有的课程和教师 8 all_courses = org.course_set.all() 9 all_teachers =org.teacher_set.all() 10 11 return render(request, \'org-detail-homepage.html\', { 12 \'org\': org, 13 \'all_courses\': all_courses, 14 \'all_teachers\': all_teachers 15 })
在organization/urls.py中添加机构首页的url:
from .views import OrgHomeView urlpatterns = [ re_path(\'home/(?P<org_id>\d+)/\', OrgHomeView.as_view(), name="org_home"), # 机构主页 ]
修改前端机构首页页面显示机构课程的代码:
然后修改机构列表页点击机构之后进入机构首页的url,修改org-list.html:
然后修改org-base.html中的几个图片显示的问题:
现在修改机构首页显示教师的前端页面的代码,不过在这之前需要在机构的model中的Teacher中加入image字段:
1 class Teacher(models.Model): 2 """机构老师""" 3 org = models.ForeignKey(CourseOrg, verbose_name=\'所属机构\', on_delete=models.CASCADE) 4 name = models.CharField(\'老师名\', max_length=50) 5 work_years =models.IntegerField(\'工作年限\', default=0) 6 work_company = models.CharField(\'就职公司\', max_length=50) 7 work_position = models.CharField(\'工作职位\', max_length=50) 8 points = models.CharField(\'教学特点\', max_length=50) 9 click_nums = models.IntegerField(\'点击数\', default=0) 10 fav_nums = models.IntegerField(\'收藏数\', default=0) 11 image = models.ImageField(\'头像\', upload_to=\'teacher/%Y/%m\', max_length=100, default=\'\') 12 add_time = models.DateTimeField(\'添加时间\', default=datetime.now) 13 14 class Meta: 15 verbose_name = \'教师\' 16 verbose_name_plural = verbose_name 17 18 def __str__(self): 19 return \'[{}]机构的教师:{}\'.format(self.org.name, self.name)
迁移数据库。
然后修改前端代码:
最后修改就够首页显示机构描述的代码:
然后在后台添加课程和教师数据。刷新机构首页即可看到数据。
2、机构课程页面
2.1 前端页面配置
将机构课程的页面org-detail-course.html拷贝到templates下。
该页面继承org_base.html页面,重写需要block的地方:
2.2 机构课程接口
1 class OrgCourseView(View): 2 """机构课程页面""" 3 def get(self, request, org_id): 4 # 根据前端的id找机构 5 org = CourseOrg.objects.get(id=int(org_id)) 6 7 # 在该机构中反向查询到该机构的所有课程 8 all_courses = org.course_set.all() 9 10 return render(request, \'org-detail-course.html\', { 11 \'org\': org, 12 \'all_courses\': all_courses 13 })
然后配置url:
1 from .views import OrgCourseView 2 3 urlpatterns = [ 4 re_path(\'course/(?P<org_id>\d+)/\', OrgCourseView.as_view(), name=\'org_course\'), # 机构课程 5 ]
修改org_base.html中跳转机构首页和机构课程的url:
然后修改机构课程页面显示的代码:
现在刷新之后就可以看到全部课程,但是有一个问题是左侧的导航栏没有选中状态,需要在各自的接口中向前端传递一个参数来记录当前是那个页面,让前端判断:
机构首页接口添加标记:
1 class OrgHomeView(View): 2 """机构首页页面""" 3 def get(self, request, org_id): 4 # 根据前端的id找机构 5 org = CourseOrg.objects.get(id=int(org_id)) 6 7 # 反向查询机构所有的课程和教师 8 all_courses = org.course_set.all() 9 all_teachers =org.teacher_set.all() 10 11 # 标记 12 current_page = \'home\' 13 14 return render(request, \'org-detail-homepage.html\', { 15 \'org\': org, 16 \'all_courses\': all_courses, 17 \'all_teachers\': all_teachers, 18 \'current_page\': current_page 19 })
机构课程结构添加标记:
1 class OrgCourseView(View): 2 """机构课程页面""" 3 def get(self, request, org_id): 4 # 根据前端的id找机构 5 org = CourseOrg.objects.get(id=int(org_id)) 6 7 # 在该机构中反向查询到该机构的所有课程 8 all_courses = org.course_set.all() 9 10 # 标记 11 current_page = \'course\' 12 13 return render(request, \'org-detail-course.html\', { 14 \'org\': org, 15 \'all_courses\': all_courses, 16 \'current_page\': current_page 17 })
然后在前端org_base.html的页面进行状态判断选定:
3、机构介绍页面
3.1 前端页面配置
将机构介绍的页面org-detail-desc.html拷贝到templates下。
该页面继承org_base.html页面,重写需要block的地方:
3.2 机构介绍接口
1 class OrgDescView(View): 2 """机构介绍页面""" 3 def get(self, request, org_id): 4 # 根据前端的id找到机构 5 org = CourseOrg.objects.get(id=int(org_id)) 6 7 # 标记 8 current_page = \'desc\' 9 10 return render(request, \'org-detail-desc.html\', { 11 \'org\': org, 12 \'current_page\': current_page 13 })
配置url:
1 from .views import OrgDescView 2 3 4 urlpatterns = [ 5 re_path(\'desc/(?P<org_id>\d+)/\', OrgDescView.as_view(), name=\'org_desc\'), # 机构介绍 6 ]
然后修改机构介绍前端的显示代码:
最后修改org_base.html中跳转机构介绍页面的url:
刷新页面即可看到机构介绍的内容。
4、机构讲师页面
4.1 前端页面配置
将机构讲师的页面org-detail-teachers.html拷贝到templates下。
该页面继承org_base.html页面,重写需要block的地方:
4.2 机构讲师接口
1 class OrgTeacherView(View): 2 """机构讲师页面""" 3 def get(self, request, org_id): 4 # 根据前端id找对机构 5 org = CourseOrg.objects.get(id=int(org_id)) 6 7 # 在机构表中反向查询所有的讲师 8 all_teachers = org.teacher_set.all() 9 10 # 标记 11 current_page = \'teacher\' 12 13 return render(request, \'org-detail-teachers.html\', { 14 \'org\': org, 15 \'all_teachers\': all_teachers, 16 \'current_page\': current_page 17 })
配置url:
1 from .views import OrgTeacherView 2 3 urlpatterns = [ 4 re_path(\'teacher/(?P<org_id>\d+)/\', OrgTeacherView.as_view(), name=\'org_teacher\'), # 机构讲师 5 ]
然后修改机构讲师页面前端的代码:
最后修改org_base.html中跳转到机构讲师的url:
5、机构收藏功能
5.1 收藏接口
1 class OrgFavView(View): 2 """机构收藏""" 3 def post(self, request): 4 # 从request中获取收藏的机构id和类型 5 id = request.POST.get(\'fav_id\', 0) 6 type = request.POST.get(\'fav_type\', 0) 7 8 # 未登录返回json数据到前端,由前端进行登录页面的跳转 9 if not request.user.is_authenticated: 10 return HttpResponse(\'{"status": "fail", "msg": "用户未登录"}\', content_type=\'application/json\') 11 12 # 在数据库中查找是否有过收藏记录: 13 exist_record = UserFavorite.objects.filter(user=request.user, fav_id=int(id), fav_type=int(type)) 14 if exist_record: 15 # 记录存在,取消收藏 16 exist_record.delete() 17 return HttpResponse(\'{"status": "success", "msg": "收藏"}\', content_type=\'application/json\') 18 else: 19 # 记录不存在,收藏 20 user_fav = UserFavorite() 21 if int(id)>0 and int(type)>0: 22 user_fav.user = request.user 23 user_fav.fav_id = int(id) 24 user_fav.fav_type = int(type) 25 user_fav.save() 26 return HttpResponse(\'{"status": "success", "msg": "已收藏"}\', content_type=\'application/json\') 27 else: 28 return HttpResponse(\'{"status": "fail", "msg": "收藏出错"}\', content_type=\'application/json\')
配置url:
1 from .views import OrgFavView 2 3 urlpatterns = [ 4 path(\'add_fav/\', OrgFavView.as_view(), name=\'add_fav\'), # 收藏 5 ]
收藏是通过ajax异步操作的,用户点击收藏,通过post方法后端进行添加收藏,取消收藏的操作,然后返回相应的json数据到前端,由前端进行显示,前端的script代码在org_base。html中,修改如下地方:
现在点击收藏(取消收藏),查看数据库中状态已经改变了,但是还有个问题就是刷新页面之后,即使是已收藏还是显示收藏,这是因为在显示的时候没有添加判断,需要在四个页面的接口中都要添加判断条件:
1 class OrgHomeView(View): 2 """机构首页页面""" 3 def get(self, request, org_id): 4 # 根据前端的id找机构 5 org = CourseOrg.objects.get(id=int(org_id)) 6 7 # 反向查询机构所有的课程和教师 8 all_courses = org.course_set.all() 9 all_teachers =org.teacher_set.all() 10 11 # 标记 12 current_page = \'home\' 13 14 # 判断收藏状态 15 has_fav = False 16 if request.user.is_authenticated: 17 if UserFavorite.objects.filter(user=request.user, fav_id=org.id, fav_type=2): 18 has_fav = True 19 20 return render(request, \'org-detail-homepage.html\', { 21 \'org\': org, 22 \'all_courses\': all_courses, 23 \'all_teachers\': all_teachers, 24 \'current_page\': current_page, 25 \'has_fav\': has_fav 26 }) 27 28 29 class OrgCourseView(View): 30 """机构课程页面""" 31 def get(self, request, org_id): 32 # 根据前端的id找机构 33 org = CourseOrg.objects.get(id=int(org_id)) 34 35 # 在该机构中反向查询到该机构的所有课程 36 all_courses = org.course_set.all() 37 38 # 标记 39 current_page = \'course\' 40 41 # 判断收藏状态 42 has_fav = False 43 if request.user.is_authenticated: 44 if UserFavorite.objects.filter(user=request.user, fav_id=org.id, fav_type=2): 45 has_fav = True 46 47 return render(request, \'org-detail-course.html\', { 48 \'org\': org, 49 \'all_courses\': all_courses, 50 \'current_page\': current_page, 51 \'has_fav\': has_fav 52 }) 53 54 55 class OrgDescView(View): 56 """机构介绍页面""" 57 def get(self, request, org_id): 58 # 根据前端的id找到机构 59 org = CourseOrg.objects.get(id=int(org_id)) 60 61 # 标记 62 current_page = \'desc\' 63 64 # 判断收藏状态 65 has_fav = False 66 if request.user.is_authenticated: 67 if UserFavorite.objects.filter(user=request.user, fav_id=org.id, fav_type=2): 68 has_fav = True 69 70 return render(request, \'org-detail-desc.html\', { 71 \'org\': org, 72 \'current_page\': current_page, 73 \'has_fav\': has_fav 74 }) 75 76 77 class OrgTeacherView(View): 78 """机构讲师页面""" 79 def get(self, request, org_id): 80 # 根据前端id找对机构 81 org = CourseOrg.objects.get(id=int(org_id)) 82 83 # 在机构表中反向查询所有的讲师 84 all_teachers = org.teacher_set.all() 85 86 # 标记 87 current_page = \'teacher\' 88 89 # 判断收藏状态 90 has_fav = False 91 if request.user.is_authenticated: 92 if UserFavorite.objects.filter(user=request.user, fav_id=org.id, fav_type=2): 93 has_fav = True 94 95 return render(request, \'org-detail-teachers.html\', { 96 \'org\': org, 97 \'all_teachers\': all_teachers, 98 \'current_page\': current_page, 99 \'has_fav\': has_fav 100 })
然后修改org_base.html中收藏状态显示的问题: