1. 课程模型类和课程标签模型类
class Course(BaseModel):
teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE, verbose_name="讲师")
course_org = models.ForeignKey(CourseOrg, null=True, blank=True, on_delete=models.CASCADE, verbose_name="课程机构")
name = models.CharField(max_length=50, verbose_name="课程名")
desc = models.CharField(max_length=300, verbose_name="课程描述")
learn_times = models.IntegerField(verbose_name="学习时长(分钟数)", default=0)
degree = models.CharField(verbose_name="难度", choices=(("cj", "初级"), ("zj", "中级"), ("gj", "高级")), max_length=2)
students = models.IntegerField(default=0, verbose_name='学习人数')
fav_nums = models.IntegerField(default=0, verbose_name='收藏人数')
click_nums = models.IntegerField(default=0, verbose_name="点击数")
category = models.CharField(default=u"后端开发", max_length=20, verbose_name="课程类别")
youneed_know = models.CharField(default="", max_length=300, verbose_name="课程须知")
teacher_tell = models.CharField(default="", max_length=300, verbose_name="老师告诉你")
detail = models.TextField(verbose_name="课程详情")
image = models.ImageField(upload_to="courses/%Y/%m", verbose_name="封面图", max_length=100)
is_classic = models.BooleanField(default=False, verbose_name="是否经典")
class Meta:
verbose_name = "课程信息"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
def lesson_nums(self):
"""课程章节数"""
return self.lesson_set.count()
class CourseTag(BaseModel):
"""课程标签表"""
course = models.ForeignKey(to=Course, on_delete=models.CASCADE, verbose_name="课程")
tag = models.CharField(max_length=50, verbose_name="课程标签")
class Meta:
verbose_name = "课程标签"
verbose_name_plural = verbose_name
def __str__(self):
return self.tag
2. 视图中的查询逻辑
class CourseDetailView(View):
def get(self, request, course_id):
"""课程详情页展示"""
course = Course.objects.get(id=int(course_id))
course.click_nums += 1
course.save()
# 查询课程所对应的机构
org = course.course_org
# 获取机构的收藏状态
is_org_collection = False
if request.user.is_authenticated:
if UserFavorite.objects.filter(user=request.user, fav_id=org.id, fav_type=2):
# 如果查到了,表示已收藏
is_org_collection = True
# 获取课程的收藏状态
is_course_collection = False
if request.user.is_authenticated:
if UserFavorite.objects.filter(user=request.user, fav_id=course.id, fav_type=1):
# 如果查到了,表示已收藏
is_course_collection = True
# 相关课程的推荐
tags = course.coursetag_set.all()
tag_list = [tag.tag for tag in tags]
course_tags = CourseTag.objects.filter(tag__in=tag_list).exclude(course=course)
related_course = set()
for course_tag in course_tags:
related_course.add(course_tag.course)
return render(request, "course-detail.html",
{"course": course, "org": org,
"is_org_collection": is_org_collection,
"is_course_collection": is_course_collection,
"related_course": related_course})