organization写完了,下面就是是courses
from django.db.models import Q
from django.http import HttpResponse
from django.shortcuts import render
# Create your views here.
from django.views.generic.base import View
from pure_pagination import Paginator, PageNotAnInteger
from courses.models import Course, CourseResourse, Video
from operation.models import UserFavorite, CourseComments, UserCourse
from utils.mixin_utils import LoginRequiredMixin
class CourseListView(View):
def get(self,request):
#从数据库获取Course表数据并且以时间降序排序
all_courses = Course.objects.all().order_by('-add_time')
#从数据库获取Course表数据并且以点击数降序排序,取前三位
hot_courses = Course.objects.all().order_by('-click_nums')[:3]
#课程搜索
search_keywords = request.GET.get('keywords','')
if search_keywords:
#name,desc,detail这三个字段不区分大小写
all_courses = all_courses.filter(Q(name__icontains=search_keywords) |
Q(desc__icontains=search_keywords) |
Q(detail__icontains=search_keywords))
#课程排序
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, 3, request=request)
courses = p.page(page)
return render(request,'course-list.html',{
'all_courses': courses,
'sort': sort,
'hot_courses': hot_courses,
})
class CourseDetailView(View):
"""
课程详情页
"""
def get(self,request,course_id):
course = Course.objects.get(id=int(course_id))
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:
relate_courses = Course.objects.filter(tag=tag)[:1]
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,
})
class CourseInfoView(LoginRequiredMixin,View):
def get(self,request,course_id):
course = Course.objects.get(id=int(course_id))
course.students += 1
course.save()
#查询用户是否已经关联了该课程
user_courses = UserCourse.objects.filter(user = request.user,course=course)
if not user_courses:
user_course = UserCourse(user = request.user,course=course)
user_course.save()
user_courses = UserCourse.objects.filter(course=course)
user_ids = [user_courses.user.id for user_courses in user_courses]
all_user_courses = UserCourse.objects.filter(user_id__in=user_ids)
#取出所有课程ID
course_ids = [user_courses.course.id for user_courses in all_user_courses]
#获取学过该用户学过其他的所有课程
relate_courses = Course.objects.filter(id__in=course_ids).order_by("-click_nums")[:5]
all_resources = CourseResourse.objects.filter(course=course)
return render(request, 'course-video.html', {
'course': course,
'all_resources': all_resources,
'relate_courses': relate_courses,
})
class CommentsView(LoginRequiredMixin,View):
def get(self,request,course_id):
course = Course.objects.get(id=int(course_id))
all_resources = CourseResourse.objects.filter(course=course)
all_comments = CourseComments.objects.all()
return render(request, 'course-comment.html', {
'course': course,
'all_resources': all_resources,
'all_comments': all_comments,
})
class AddCommentsView(View):
"""
用户添加课程评论
"""
def post(self,request):
if not request.user.is_authenticated:
return HttpResponse('{"status ":"fail","msg":"用户未登录"}', content_type='application/json')
course_id = request.POST.get("course_id",0)
comments = request.POST.get("comments","")
if int(course_id)>0 and comments:
#这里的CourseComments是课程评论的数据表
course_comments = CourseComments()
course = Course.objects.get(id=course_id)
course_comments.course = course
course_comments.comments = comments
course_comments.user = request.user
course_comments.save()
return HttpResponse('{"status":"success","msg":"添加成功"}', content_type='application/json')
else:
return HttpResponse('{"status":"fail","msg":"添加失败"}', content_type='application/json')
class VideoPlayView(View):
"""
课程视频播放页
"""
def get(self, request, video_id):
video = Video.objects.get(id=int(video_id))
course = video.lesson.course
course.students += 1
course.save()
# 查询用户是否已经关联了该课程
user_courses = UserCourse.objects.filter(user=request.user, course=course)
if not user_courses:
user_course = UserCourse(user=request.user, course=course)
user_course.save()
user_courses = UserCourse.objects.filter(course=course)
#这里采用了列表推导式,作用是循环依次取出user_courses中的每一个数据赋值给user_course,然后在这基础上,取出这个值的user.id值。
user_ids = [user_course.user.id for user_course in user_courses]
all_user_courses = UserCourse.objects.filter(user_id__in=user_ids)
# 取出所有课程ID
course_ids = [user_courses.course.id for user_courses in all_user_courses]
# 获取学过该用户学过其他的所有课程
relate_courses = Course.objects.filter(id__in=course_ids).order_by("-click_nums")[:5]
all_resources = CourseResourse.objects.filter(course=course)
return render(request, 'course-play.html', {
'video': video,
'course': course,
'all_resources': all_resources,
'relate_courses': relate_courses,
})
course_list:
{% extends 'base.html' %}
{% block title %}公开课列表-慕学在线网{% endblock %}
{% load staticfiles %}
{% block custom_bread %}
<section>
<div class="wp">
<ul class="crumbs">
<li><a href="{% url 'index' %}">首页</a>></li>
<li>公开课</li>
</ul>
</div>
</section>
{% endblock %}
{% block contend %}
<section>
<div class="wp">
<div class="list" style="margin-top:0;">
<div class="left layout">
<div class="head">
<ul class="tab_header">
<li {% if sort == '' %}class='active'{% endif %}><a href="?sort=">最新 </a></li>
<li {% if sort == 'hot' %}class='active'{% endif %}><a href="?sort=hot">最热门</a></li>
<li {% if sort == 'students' %}class='active'{% endif %}><a href="?sort=students">参与人数</a></li>
</ul>
</div>
<div id="inWindow">
<div class="tab_cont " id="content">
<div class="group_list">
{% for course in all_courses.object_list %}
<div class="box">
<a href="{% url 'course:course_detail' course.id %}">
<img width="280" height="350" class="scrollLoading" src="{
{ MEDIA_URL }}{
{ course.image }}"/>
</a>
<div class="des">
<a href="{% url 'course:course_detail' course.id %}">
<h2>{
{ course.name }}</h2>
</a>
<span class="fl">时长:<i class="key">{
{ course.learn_times }}</i></span>
<span class="fr">学习人数:{
{ course.students }} </span>
</div>
<div class="bottom">
<a href="{% url 'course:course_detail' course.id %}"><span class="fl">{
{ course.course_org.name }}</span></a>
<span class="