功能:
- 授课机构列表(可分页,可按类别,地区筛选,可按学习人数和课程数排序)
- 机构详情页(可收藏机构,有哪些课程,讲师,以及机构介绍)
- 可咨询课程(使用ModelForm)
对应的url
urlpatterns = [
#列表
url(r'^list/', OrgView.as_view(), name='org_list'),
#咨询
url(r'^add_ask/', AskView.as_view(), name='add_ask'),
url(r'^home/(?P<org_id>\d+)/$', OrgHomeView.as_view(), name='org_home'),#机构首页
url(r'^course/(?P<org_id>\d+)/$', OrgCourseView.as_view(), name='org_course'),#机构课程
url(r'^desc/(?P<org_id>\d+)/$', OrgDescView.as_view(), name='org_desc'),
url(r'^org_teacher/(?P<org_id>\d+)/$', OrgTeacherView.as_view(), name='org_teacher'),
# 收藏
url(r'^add_fav/', AddFavView.as_view(), name='add_fav'),
]
机构列表功能实现
实现后,返回前端页面,使用模板语言进行填充即可。
class OrgView(View):
'''
课程机构
'''
def get(self, request):
# 所有机构
all_orgs = CourseOrg.objects.all()
org_nums = all_orgs.count()
# 所有城市
all_citys = CityDict.objects.all()
# 搜索
keyword = request.GET.get('keywords', '')
if keyword:
# i表示忽略大小写
all_orgs = all_orgs.filter(
Q(name__icontains=keyword) | Q(desc__icontains=keyword))
# 类别筛选
category = request.GET.get('ct', '')
if category:
all_orgs = all_orgs.filter(category=category)
# 城市筛选
city_id = request.GET.get('city', '')
if city_id:
all_orgs = all_orgs.filter(city_id=int(city_id))
# 热门机构排名,按照点击次数降序
hot_orgs = all_orgs.order_by('-click_nums')[:3]
# 按照机构的学习人数或者课程数排序
sort = request.GET.get('sort', '')
if sort == 'students':
all_orgs = all_orgs.order_by('-students')
elif sort == 'courses':
all_orgs = all_orgs.order_by('-course_nums')
# 分页处理,每页两个
try:
page = request.GET.get('page', 1)
except PageNotAnInteger:
page = 1
p = Paginator(all_orgs, 2, request=request)
orgs = p.page(page)
return render(request, 'org-list.html',
{
'all_orgs': orgs,
'all_citys': all_citys,
'org_nums': org_nums,
'hot_orgs': hot_orgs,
'category': category,
# 传回sort和city_id,目的是为了判断选中状态,增加active属性
'sort': sort,
'city_id': city_id,
})
分页的实现:
分页用了django pure_pagination 库,可去github下载https://github.com/jamespacileo/django-pure-pagination。
机构首页
在机构列表页,点击一个机构,会向后台发送一个get请求,带上这个课程的id,后台获取这个机构有哪些课程、讲师、讲师有什么课。
class OrgHomeView(View):
def get(self, request, org_id):
current_page = 'home'
# 找到这个机构有哪些课程、教师、讲师有什么课
course_org = CourseOrg.objects.get(id=int(org_id))
has_fav = False
#判断是否已收藏
if request.user.is_authenticated:
if UserFavorite.objects.filter(user=request.user, fav_id=course_org.id, fav_type=2):
has_fav = True
# 反向查找课程和讲师
all_courses = course_org.course_set.all()[:4]
all_teacher = course_org.teacher_set.all()[:2]
return render(request, 'org-detail-home.html', {'course_org': course_org,
'all_courses': all_courses,
'all_teacher': all_teacher,
'current_page': current_page,
'has_fav': has_fav})
咨询功能
发送ajax请求
<script>
//给立即咨询按钮绑定点击事件
$('#jsStayBtn').click(function () {
$.ajax({
cache: false,
url: "{% url 'org:add_ask' %}",
type: "post",
data: $('#jsStayForm').serialize(),//把form表单的值序列化成一个字符串
async: true,
success: function (data) {
if (data.status == 'success') {
$('#jsStayForm')[0].reset();
alert('提交成功');
} else if (data.status == 'fail') {
$('#jsCompanyTips').html(data.msg);//删除错误信息
}
}
})
})
</script>
后台代码:
class AskView(View):
'''
用户添加咨询,只有post请求
'''
def post(self, request):
use_post = UserAskForm(request.POST) # 使用ModelForm,实例化
if use_post.is_valid():
use_post.save(commit=True) # 当commit为True,可以直接把提交的数据保存在数据库
return HttpResponse('{"status":"success"}', content_type='application/json')
else:
return HttpResponse('{"status":"fail","msg":"添加出错"}', content_type='application/json')
机构课程、介绍、讲师功能实现:
根据机构id,分别获取对应的数据
#课程
class OrgCourseView(View):
def get(self, request, org_id):
current_page = 'course'
course_org = CourseOrg.objects.get(id=int(org_id))
# 反向查找课程
has_fav = False
if request.user.is_authenticated:
if UserFavorite.objects.filter(user=request.user, fav_id=course_org.id, fav_type=2):
has_fav = True
all_courses = course_org.course_set.all()[:4]
return render(request, 'org-detail-course.html', {'course_org': course_org,
'all_courses': all_courses,
'current_page': current_page,
'has_fav': has_fav})
收藏功能实现:
收藏需要判断是否已经收藏过,如果已经收藏过,则是取消收藏。收藏分为三类,收藏教师、机构或课程。
class AddFavView(View):
def post(self, request):
id = request.POST.get('fav_id', 0)
type = request.POST.get('fav_type', 0)
if not request.user.is_authenticated:
# 未登录
return HttpResponse('{"status":"fail","msg":"用户未登录"}', content_type='application/json')
exist_record = UserFavorite.objects.filter(user=request.user, fav_id=int(id), fav_type=int(type))
if exist_record:
# 用户已经收藏过,再点击表示取消收藏
exist_record.delete()
if int(type) == 1:
course = Course.objects.get(id=int(id))
course.fav_nums -= 1
if course.fav_nums < 0:
course.fav_nums = 0
course.save()
elif int(type) == 2:
teacher_obj = Teacher.objects.get(id=int(id))
teacher_obj.fav_nums -= 1
if teacher_obj.fav_nums < 0:
teacher_obj.fav_nums = 0
teacher_obj.save()
elif int(type) == 3:
course = Course.objects.get(id=int(id))
course.fav_nums -= 1
if course.fav_nums < 0:
course.fav_nums = 0
course.save()
return HttpResponse({"status": "success", "msg": "收藏"}, content_type='application/json')
else:
user_fav = UserFavorite()
if int(type) > 0 and int(id) > 0:
user_fav.fav_id = int(id)
user_fav.fav_type = int(type)
user_fav.user = request.user
user_fav.save()
if int(type) == 1:
course = Course.objects.get(id=int(id))
course.fav_nums += 1
course.save()
elif int(type) == 2:
org = CourseOrg.objects.get(id=int(id))
org.fav_nums += 1
org.save()
elif int(type) == 3:
teacher = Teacher.objects.get(id=int(id))
teacher.fav_nums += 1
teacher.save()
return HttpResponse({"status": "success", "msg": "已收藏"}, content_type='application/json')
else:
return HttpResponse({"status": "fail", "msg": "收藏出错"}, content_type='application/json')