1、把course-detail.html复制到templates目录下

2、编辑course-detail.html,分析页面,继承base.html

3、编辑courses.views

....

class CourseDetailView(View):
def get(self, request, course_id):
return render(request, 'course-detail.html', {})

4、创建一个url,编辑courses.urls.py

...
from .views CourseDetailView urlpatterns = [
...
url(r'^detail/(?P<course_id>\d+)/$', CourseDetailView.as_view(), name='course_detail'), ] 

5、现在去课程列表页,把进入课程详情的连接改下

现在,我们在课程列表页点击课程,就能够进入课程详情页了,只是里面的内容我们还没有进行动态展示,下面来完成

分析页面,先完成第一部分

编辑courses.views.py

class CourseDetailView(View):
def get(self, request, course_id):
course = Course.objects.get(id=course_id) #根据课程id参数查询到课程
return render(request, 'course-detail.html', {
"course": course,
})

前端展示

现在主要是"章节数","学习用户"该如何获取?可以在数据模型写个方法获取(Django外键反向取出数据)

class Course(models.Model):
name = models.CharField(max_length=50, verbose_name='课程名')
course_org = models.ForeignKey(CourseOrg, verbose_name='课程机构')
desc = models.CharField(max_length=300, verbose_name='课程描述')
details = models.TextField(verbose_name='课程详情')
degree = models.CharField(verbose_name='课程难度', choices=(('cj', '初级'), ('zj', '中级'), ('gj', '高级')), max_length=2)
learn_times = models.IntegerField(default=0, verbose_name='学习时长(分钟)')
students = models.IntegerField(default=0, verbose_name='学习人数')
fav_nums = models.IntegerField(default=0, verbose_name='收藏人数')
image = models.ImageField(upload_to='courses/%Y/%m', verbose_name='封面图', max_length=100)
click_nums = models.IntegerField(default=0, verbose_name='点击数')
category = models.CharField(max_length=20, default='', verbose_name=u'课程类别')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间') class Meta:
verbose_name = '课程'
verbose_name_plural = verbose_name def get_lesson_nums(self):
"""获取章节数"""
return self.lesson_set.count() def get_learn_students(self):
"""获取3个学习用户"""
return self.usercourse_set.all()[:3] def __str__(self):
return self.name

现在前端就可以取出这两项了  

完成第二部分:授课机构

教师数和前面一样,因为Teacher表有外键关联到机构,因此我们可以通过机构来反向获取到教师数

class CourseOrg(models.Model):
name = models.CharField(max_length=50, verbose_name='机构名称')
desc = models.TextField(verbose_name='机构描述')
category = models.CharField(max_length=20, default='jg', choices=(('jg', '机构'), ('gr', '个人'), ('gx', '高校')),
verbose_name='机构类别')
click_nums = models.IntegerField(default=0, verbose_name='点击数')
fav_nums = models.IntegerField(default=0, verbose_name='收藏数')
image = models.ImageField(upload_to='organization/%Y/%m', verbose_name='封面图', max_length=100)
address = models.CharField(max_length=150, verbose_name='机构地址', blank=True)
city = models.ForeignKey(CityDict, verbose_name='所在城市')
students = models.IntegerField(default=0, verbose_name='学习人数')
course_nums = models.IntegerField(default=0, verbose_name='课程数')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间') class Meta:
verbose_name = '课程机构'
verbose_name_plural = verbose_name def get_teacher_nums(self):
"""获取机构教师数"""
return self.teacher_set.count() def __str__(self):
return self.name

前端动态数据展示

完成第三部分:相关课程推荐

要实现相关课程推荐,我们可以在课程那里添加个字段(tag),然后根据tag筛选出相关课程

①、编辑courses.models.py,在Course下添加tag字段

②数据结构同步到数据库

③编辑courses.views

class CourseDetailView(View):
def get(self, request, course_id):
course = Course.objects.get(id=course_id) # 进入详情页面,增加1次点击量
course.click_nums += 1 # 相关课程推荐
tag = course.tag
if tag:
relate_courses = Course.objects.filter(tag=tag)[:2]
else:
relate_courses = [] return render(request, 'course-detail.html', {
"course": course,
"relate_courses": relate_courses,
})

前端动态展示数据

把课程详情部分改掉

第四部分:收藏功能

收藏功能可以直接使用之前在课程机构那里定义的接口

编辑course-detail.html下面的js

编辑courses.views.py

...
from operation.models import UserFavorite class CourseDetailView(View):
def get(self, request, course_id):
course = Course.objects.get(id=course_id) # 进入详情页面,增加1次点击量
course.click_nums += 1 # 相关课程推荐
tag = course.tag
if tag:
relate_courses = Course.objects.filter(tag=tag)[:2]
else:
relate_courses = [] # 收藏
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=1):
has_fav_org = True return render(request, 'course-detail.html', {
"course": course,
"relate_courses": relate_courses,
"has_fav_course": has_fav_course,
"has_fav_org": has_fav_org,
})

前端页面配置

注意:

如果发现点击"收藏"没反应,在base.html把{% block custom_js %}{% endblock %}放到body最后面

20、Django实战第20天:课程详情页的更多相关文章

  1. mxonline实战10,课程列表页,课程详情页1

    对应github地址:第10天   一. 课程列表页   1. 拷贝course-list.html到templates目录中 2. 编写url和view 在courses/views.py中新加

  2. mxonline实战11,课程详情页2,课程章节页

    对应github地址:第11天   一. 课程详情页2   1. 课程详情页第2块中的课程介绍中,修改course-detail.html中代码,搜索课程详情,找到如下代码

  3. Luffy之课程详情页

    Luffy之课程详情页 提前写好课程详情的template,并放入到Vue中 注册路由 import CourseDetail from "../components/CourseDetai ...

  4. Django实战(20):分页(Pagination)

    在上一节我们实现了针对某个产品的订单订阅功能.但是我们可能需要直接在站点上查询所有的订单.显然,随着时间的增长订单会越来越多,所以分页(Pagination)是个好办法:每次只显示一部分订单. 分页是 ...

  5. 21、Django实战第21天:课程章节信息

    在课程详情页中,点击"开始学习",就进入到这课程章节信息,这里面包含了两个页面:"章节"和评论 1.把course-video.html(章节).course- ...

  6. mxonline实战12, 课程评论,相关课程推荐,课程视频页

    对应github地址:第12天   一. 课程评论   1. 创建URL, VIEW courses/views.py -> Course

  7. day82:luffy:课程详情页面显示&章节和课时显示&视频播放组件&CKEditor富文本编辑器

    目录 1.初始课程详情页面 2.视频播放组件 3.课程详情页面后端接口实现 4.课程详情页面-前端 5.CKEditor富文本编辑器 6.课程章节和课时显示-后端接口 7.课程章节和课时显示-前端 1 ...

  8. 22、Django实战第22天:课程评论

    1.编辑course-comment.html 2.编辑courses.views.py class CourseCommentView(LoginRequiredMixin, View): def ...

  9. 17、Django实战第17天:机构详情展示

    1.进入xadmin添加测试数据(教师.课程) 2.把以下4个前端页面复制到templates中 先打开这几个页面分析,它们和之前的课程机构列表页是不一样的机构,且没有共同的部分,但是这4个页面却是类 ...

随机推荐

  1. oracle的sequece的使用(主键自增长)

    在Oracle数据库中,sequence等同于序列号,每次取的时候sequence会自动增加,一般会作用于需要按序列号排序的地方. 1.Create Sequence (注释:你需要有CREATE S ...

  2. tomcat内存配置(二)

    Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机.Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对JavaJVM有关内存方面的知识进 ...

  3. auto login vpnclient bat

    @echo offstart "" /b "C:\Program Files (x86)\Cisco Systems\VPN Client\vpngui.exe" ...

  4. 我之理解---计时器setTimeout 和clearTimeout

    今天在写个图片切换的问题 有动画滞后的问题,才动手去查setTimeout 和clearTimeout.之前写的图片播放器也有类似的问题,有自动start按钮 和stop按钮, 其他都正常,问题出在每 ...

  5. c语言指针学习【转】

    前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水, ...

  6. swift中_的用法,忽略默认参数名。

    swift中默认参数名除了第一个之外,其他的默认是不忽略的,但是如果在参数的名字前面加上_,就可以忽略这个参数名了,虽然有些麻烦,但是这种定义也挺好,而且不想知道名字或者不想让别人知道名字的或者不用让 ...

  7. DotNet 学习笔记 应用状态管理

    Application State Options --------------------------------------------------------------------- *Htt ...

  8. 鼠标DPI和液晶显示器分辨率的关系

    鼠标DPI和液晶显示器分辨率的关系 说起鼠标,有两个性能指标是我们不能忽略的.一是游戏玩家相当熟悉的扫描率(单位:Frames Per Second),二是我们今天要和大家探讨的鼠标的分辨率(单位:D ...

  9. Opencv 学习笔记之——鼠标,进度条操作

    Opencv中提供一个鼠标调用的函数,SetMouseCallback()函数,它配合一个回调函数来实现鼠标操作的功能.   首先看一下SetMouseCallback的函数原型: c++: void ...

  10. 查看Linux上的CPU核心数、线程数

    grep "physical id" /proc/cpuinfo|sort -u grep "cpu cores" /proc/cpuinfo|uniq gre ...