本章主要内容:
- 完善整站的实现细节, 如修改点击数、收藏数以及登出功能等
- 实现系统的首页, 最后配置系统的全局404和500页面
退出登录功能
借助django的logout函数进行退出,退出后还要重定向到首页
from django.contrib.auth import authenticate, login, logout
from django.http import HttpResponse, HttpResponseRedirect
from django.core.urlresolvers import reverse
class LogoutView(View):
"""
用户登出
"""
def get(self, request):
logout(request)
return HttpResponseRedirect(reverse("index"))
课程点击数的计算
在用户请求课程的详情页的时候,将课程的点击数加一
course = Course.objects.get(id=int(course_id))
#增加课程点击数
course.click_nums += 1
course.save()
课程的学习次数的计算
用户点击课程的“我要学习”按钮后,学习次数加一
course = Course.objects.get(id=int(course_id))
course.students += 1
course.save()
几种收藏数的增减
如果收藏记录已存在,则删除记录;如果不存在,则增加
要判断收藏的类型
class AddFavView(View):
"""
用户收藏,用户取消收藏
"""
def post(self, request):
fav_id = request.POST.get('fav_id', 0)
fav_type = request.POST.get('fav_type', 0)
if not request.user.is_authenticated():
#判断用户登录状态
return HttpResponse('{"status":"fail", "msg":"用户未登录"}', content_type='application/json')
exist_records = UserFavorite.objects.filter(user=request.user, fav_id=int(fav_id), fav_type=int(fav_type))
if exist_records:
#如果记录已经存在, 则表示用户取消收藏
exist_records.delete()
if int(fav_type) == 1:
course = Course.objects.get(id=int(fav_id))
course.fav_nums -= 1
if course.fav_nums < 0:
course.fav_nums = 0
course.save()
elif int(fav_type) == 2:
course_org = CourseOrg.objects.get(id=int(fav_id))
course_org.fav_nums -= 1
if course_org.fav_nums < 0:
course_org.fav_nums = 0
course_org.save()
elif int(fav_type) == 3:
teacher = Teacher.objects.get(id=int(fav_id))
teacher.fav_nums -= 1
if teacher.fav_nums < 0:
teacher.fav_nums = 0
teacher.save()
return HttpResponse('{"status":"success", "msg":"收藏"}', content_type='application/json')
else:
user_fav = UserFavorite()
if int(fav_id) > 0 and int(fav_type) > 0:
user_fav.user = request.user
user_fav.fav_id = int(fav_id)
user_fav.fav_type = int(fav_type)
user_fav.save()
if int(fav_type) == 1:
course = Course.objects.get(id=int(fav_id))
course.fav_nums += 1
course.save()
elif int(fav_type) == 2:
course_org = CourseOrg.objects.get(id=int(fav_id))
course_org.fav_nums += 1
course_org.save()
elif int(fav_type) == 3:
teacher = Teacher.objects.get(id=int(fav_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')
我的消息
用户进入个人消息页面后,把所有未读的消息置为已读
class MymessageView(LoginRequiredMixin, View):
"""
我的消息
"""
def get(self, request):
all_messages = UserMessage.objects.filter(user=request.user.id)
#用户进入个人消息后清空未读消息的记录
all_unread_messages = UserMessage.objects.filter(user=request.user.id, has_read=False)
for unread_message in all_unread_messages:
unread_message.has_read = True
unread_message.save()
#对个人消息进行分页
try:
page = request.GET.get('page', 1)
except PageNotAnInteger:
page = 1
p = Paginator(all_messages, 5, request=request)
messages = p.page(page)
return render(request, 'usercenter-message.html', {
"messages":messages
})
首页
首页有轮播,轮播课程,普通课程,机构
class IndexView(View):
#慕学在线网 首页
def get(self, request):
#取出轮播图
all_banners = Banner.objects.all().order_by('index')
courses = Course.objects.filter(is_banner=False)[:6]
banner_courses = Course.objects.filter(is_banner=True)[:3]
course_orgs = CourseOrg.objects.all()[:15]
return render(request, 'index.html', {
'all_banners':all_banners,
'courses':courses,
'banner_courses':banner_courses,
'course_orgs':course_orgs
})
配置整站的404,500页面
- 在项目的urls.py下配置两个参数,字符串分别表示404,500的函数位置
#全局404页面配置
handler404 = 'users.views.page_not_found'
handler500 = 'users.views.page_error'
- 404函数,500函数
def page_not_found(request):
#全局404处理函数
from django.shortcuts import render_to_response
response = render_to_response('404.html', {})
response.status_code = 404 # 这个状态码会影响浏览器的显示
return response
def page_error(request):
#全局500处理函数
from django.shortcuts import render_to_response
response = render_to_response('500.html', {})
response.status_code = 500
return response
最后需要将settings的DEBUG改为FALSE,404时才会调用执行我们的404函数
要注意的是:当DEBUG为FALSE时,Django不会代管static和media的资源,一般在生产环境下,静态资源会由第三方的服务器如Nginx来管理
如果要让Django的服务器来代管静态资源,则需在settings中配置
STATIC_URL = '/static/'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
- 在urls.py中配置
from MxOnline.settings import MEDIA_ROOT,STATIC_ROOT
#配置上传文件的访问处理函数
url(r'^media/(?P<path>.*)$', serve, {"document_root":MEDIA_ROOT}),
url(r'^static/(?P<path>.*)$', serve, {"document_root":STATIC_ROOT}),
- 在访问首页的get方法内添加print 1/0后