第11章 首页、全局功能细节和404以及500页面配置

本章主要内容:

  • 完善整站的实现细节, 如修改点击数、收藏数以及登出功能等
  • 实现系统的首页, 最后配置系统的全局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后

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值