代码
八、课程详情页功能的实现
8.1.课程列表
(1)配置urls
MxOnline/urls中
path("course/", include('course.urls', namespace="course")),
course里面新建urls.py
# course/urls.pyfrom django.urls import path,re_pathfrom .views import CourseListView# 要写上app的名字app_name = "course"urlpatterns = [ path('list/',CourseListView.as_view(),name='course_list'),]
把course-list.html拷贝到templates目录下
from django.shortcuts import renderfrom django.views.generic import Viewclass CourseListView(View): def get(self, request): return render(request, "course-list.html")
(2)course-list.html继承base.html
修改title,修改bread里面,content里面放course-list独有的
course-list.html
然后去后台添加十门课程
(3)列表展示
views.py
# course/views.pyfrom django.shortcuts import renderfrom django.views.generic import Viewfrom .models import Courseclass CourseListView(View): def get(self, request): all_courses = Course.objects.all() return render(request, "course-list.html",{'all_courses':all_courses})
course-list.html
{% for course in all_course %}{% endfor %}来自{ { course.course_org.name }} { { course.fav_nums }}
8.2.分页
try: page = request.GET.get('page', 1) except PageNotAnInteger: page = 1 p = Paginator(all_courses,2 , request=request) courses = p.page(page)
{% if all_courses.has_previous %}
- 上一页
{% endif %} {% for page in all_courses.pages %} {% if page %} {% ifequal page all_courses.number %}- { { page }}
{% else %}- { { page }}
{% endifequal %} {% else %}- ...
{% endif %} {% endfor %} {% if all_courses.has_next %}- 下一页
{% endif %}
8.3.排序
class CourseListView(View): def get(self, request): all_courses = Course.objects.all().order_by('-add_time') # 热门课程推荐 hot_courses = Course.objects.all().order_by('-click_nums')[:3] # 排序 sort = request.GET.get('sort', "") if sort: if sort == "students": all_courses = all_courses.order_by("-students") elif sort == "hot": all_courses = all_courses.order_by("-click_nums") # 分页 try: page = request.GET.get('page', 1) except PageNotAnInteger: page = 1 p = Paginator(all_courses,2 , request=request) courses = p.page(page) return render(request, "course-list.html", { "all_courses":courses, 'sort': sort, 'hot_courses':hot_courses, })
热门课程推荐{% for hot_course in hot_courses %}{% endfor %}
{ { hot_course.name }}
难度:{ { hot_course.get_degree_display }}
course-list.html
views.py
8.4.课程详情
course-detail.html复制进来
(1)url配置
re_path('course/(?P\d+)/', CourseDetailView.as_view(), name="course_detail"),
class CourseDetailView(View): '''课程详情''' def get(self, request, course_id): return render(request, "course-detail.html", { })
在course-list.html中添加链接到详情
(2)views
class CourseDetailView(View): '''课程详情''' def get(self, request, course_id): course = Course.objects.get(id=int(course_id)) # 课程的点击数加1 course.click_nums += 1 course.save() return render(request, "course-detail.html", { 'course':course, })
(3)Course model增加
- 一个category字段
- 一个获取章节数的方法
- 一个获取这么课程的学习用户方法
Course
(4)course-detail.html中课程详情信息显示
{ { course.name }}
{ { course.desc }}难度:{ { course.get_degree_display }} 学习人数:{ { course.students }}
- 时 长:{ { course.learn_times }}
- 章 节 数:{ { course.get_zj_nums }}
- 课程类别:{ { course.category }}
- 学习用户: {% for user_course in course.get_learn_users %} {% endfor %}
显示课程详情
8.5.授课机构
(1)CourseOrg model添加一个获取教师数的方法
def get_teacher_nums(self): #获取机构的教师数 return self.teacher_set.all().count()
CourseOrg
(2)授课机构显示
授课机构
世界名校,课程权威
{ { course.course_org.name }}
已收藏
- 课 程 数: { { course.course_org.course_nums }}
- 教 师 数: { { course.course_org.get_teacher_nums }}
- 所在地区: { { course.course_org.address }}
- 认 证 :
8.6.相关课程推荐
(1)给“Course” model添加一个“课程标签”字段
tag = models.CharField('课程标签',default='',max_length=10)
Course
(2)views
class CourseDetailView(View): '''课程详情''' def get(self, request, course_id): course = Course.objects.get(id=int(course_id)) # 课程的点击数加1 course.click_nums += 1 course.save() # 课程标签 # 通过当前标签,查找数据库中的课程 tag = course.tag if tag: # 需要从1开始不然会推荐自己 relate_courses = Course.objects.filter(tag=tag)[:3] else: relate_courses = [] return render(request, "course-detail.html", { 'course':course, 'relate_courses':relate_courses, })
(3)前端
相关课程推荐{% for relate_course in relate_courses %}{% endfor %}
{ { relate_course.name }}
学习时长:{ { relate_course.learn_times }}
8.7.课程收藏和机构收藏
{% block custom_js %}{% endblock %},放到最下面的位置,因为是js代码,要最后加载
后端判断当前收藏转态
class CourseDetailView(View): '''课程详情''' def get(self, request, course_id): course = Course.objects.get(id=int(course_id)) # 课程的点击数加1 course.click_nums += 1 course.save() # 课程标签 # 通过当前标签,查找数据库中的课程 has_fav_course = False has_fav_org = False # 必须是用户已登录我们才需要判断。 if request.user.is_authenticated: if UserFavorite.objects.filter(user=request.user, fav_id=course.id, fav_type=1): has_fav_course = True if UserFavorite.objects.filter(user=request.user, fav_id=course.course_org.id, fav_type=2): has_fav_org = True tag = course.tag if tag: # 需要从1开始不然会推荐自己 relate_courses = Course.objects.filter(tag=tag)[:2] else: relate_courses = [] return render(request, "course-detail.html", { 'course':course, 'relate_courses':relate_courses, "has_fav_course": has_fav_course, "has_fav_org": has_fav_org, })
course-detail.html中添加Ajax
{% block custom_js %} {% endblock %}