零基础使用Django2.0.1打造在线教育网站(二十四):全局页面配置

关于博主

努力与运动兼备~~~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!

                                      微信公众号:  啃饼思录
                                    QQ: 2810706745(啃饼小白)

写在前面

本篇笔记我们将介绍全局页面的配置,具体包括首页登出实现,点击数加1,收藏数配置,小喇叭消息已读配置,首页的开发以及404和500页面的配置等功能,下面我们依次介绍一下。

本篇笔记对应于第二十四篇代码,对应于github的位置是https://github.com/licheetools/eduline

首页登出实现

现在我们来完善我们首页的系统登出功能,这个没有页码,你登出后只需要跳转到首页即可,所以我们只需要写一个view就能完成这个操作。

老规矩先配置path:打开eduline/urls.py文件,新增以下代码:

from users.views import LogoutView

# 登出url
    path('logout/', LogoutView.as_view(), name="logout"),

然后打开users/view.py文件,在login的函数下面新增以下代码:

from django.urls import reverse
from django.contrib.auth import  logout
from django.http import HttpResponseRedirect


# 用于实现用户首页登出的函数
class LogoutView(View):
    def get(self, request):
        # 采用Django自带的logout函数来完成我们登出的功能
        logout(request)
        # 不采用之前的render,而是采用重定向返回到首页
        return HttpResponseRedirect(reverse("index"))

接下来在base.html页面进行跳转链接的配置:

别忘了还有其余2个base页面跳转的配置,很简单,这里就不介绍了。

点击数加1

1、为课程数加1:打开courses/view.py文件,找到CourseInfoView函数,新增以下代码:

course.students += 1
course.save()

就是这个样子:

2、为讲师数加1:打开organization/view.py文件,找到TeacherDetailView函数,新增以下代码:

teacher.click_nums += 1
teacher.save()

就是这个样子:

3、为机构数加1:打开organization/view.py文件,找到OrgHomeView函数,新增以下代码:

course_org.click_nums += 1
course_org.save()

就是这个样子:

收藏数配置

其实收藏数我们在之前已经配置过了,但在这里重新提一下:在organization/views.py文件,我们找到AddFavView函数,就是这段代码:

# 用户收藏与取消收藏功能
class AddFavView(View):
    def post(self, request):
        # 取出fav_id,尽管是字符串类型,但是我们后面会进行整型转换,所以默认为0
        fav_id = request.POST.get('fav_id', 0)
        # 取到fav_type,尽管是字符串类型,但是我们后面会进行整型转换,所以默认为0
        fav_type = request.POST.get('fav_type', 0)

        # 未收藏时收藏和已收藏时取消收藏
        # 判断用户是否登录,即使用户没有登录会有一个匿名的user
        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
                course.save()
                if course.fav_nums <= 0:
                    course.fav_nums = 0
            elif int(fav_type) == 2:
                course_org = CourseOrg.objects.get(id=int(fav_id))
                course_org.fav_nums -= 1
                course_org.save()
                if course_org.fav_nums <= 0:
                    course_org.fav_nums = 0
            elif int(fav_type) == 3:
                teacher = Teacher.objects.get(id=int(fav_id))
                teacher.fav_nums -= 1
                teacher.save()
                if teacher.fav_nums <= 0:
                    teacher.fav_nums = 0

            return HttpResponse('{"status":"success", "msg":"收藏"}', content_type='application/json')
        else:
            user_fav = UserFavorite()
            # 过滤掉未取到fav_id type的默认情况
            if int(fav_type) > 0 and int(fav_id) > 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')

下面那一大长段的if...elif...就是用于记录用户对课程,机构,讲师的收藏记录,自己再次好好体会一下。

接下来就是自己自行完善已经可以完成的url的跳转,由于太多,这里就不显示了,大家可以去我的github上查看详细的源代码,并进行对比!

小喇叭消息已读配置

前面我们只是在各个页面显示了未读消息,但是当我们读了这些信息以后,我们的未读消息是不是需要清空呢?接下来就是完善这个功能。打开users/views.py文件,新增以下代码:

# 用户进入个人中心之后,清空未读消息
        all_unread_mesages = UserMessage.objects.filter(user=request.user.id,has_read=False)
        for unread_mesages in all_unread_mesages:
            unread_mesages.has_read = True
            unread_mesages.save()

就是这个样子:

我们之前取了用户的所以消息,但是我们要的只是未读消息,所以需要配置一下:

打开users/model.py文件,代码修改为:

    def get_unread_nums(self):
        # 获取用户的未读消息的数量
        from operation.models import UserMessage
        return UserMessage.objects.filter(user=self.id, has_read=False).count()

就是这个样子:

首页的开发

打开users/urls.py文件,修改首页path:

from users.views import IndexView

# 首页url
path('', IndexView.as_view(), name="index"),

然后打开users/views.py文件,新定义一个函数:

from .models import Banner


# 慕海学习网首页函数
class IndexView(View):
    def get(self, request):
        # 取出录播图只显示5个,并按照顺序排列
        all_banners = Banner.objects.all().order_by("index")[:5]
        # 取出轮播课程,但是只显示3个
        banner_courses = Course.objects.filter(is_banner=True)[:3]
        # 取出非轮播课程,但是只显示6个
        courses = Course.objects.filter(is_banner=False)[:6]
        # 取出课程机构,但是只显示15个
        course_orgs = CourseOrg.objects.all()[:15]
        return render(request, "index.html", {
            "all_banners": all_banners,
            "banner_courses": banner_courses,
            "courses": courses,
            "course_orgs": course_orgs,
        })

然后去你的xadmin添加5个轮播图,和修改轮播课程

接着就是去index.html页面配置数据的动态加载了:

注意:{{ forloop.counter|add:2 }}是为了从第三个开始计数的,这是Django自带的功能

同样注意:{% if forloop.counter|divisibleby:5 %}five{% endif %}表示如果能被5整除则显示five,这也是Django自带的功能

打开users/views.py文件,修改登录页面,解决登录信息没有及时显示的问题。

404和500页面的配置

老规矩,从前端资料里面拷贝我们的404和500页面到templates文件夹并修改文件里面的静态文件地址。打开eduline/urls.py文件,新增代码如下:

# 全局404页面配置
handler404 = 'users.views.page_not_found'

就是这个样子:

然后打开users/views.py文件,新增以下代码:

# 404页面对应的处理函数
def page_not_found(request):
    from django.shortcuts import render_to_response
    response = render_to_response("404.html", {

    })
    # 设置response的状态码
    response.status_code = 404
    return response

接着运行我们的项目,随意输入一个地址,发现页面并没有出来,那是因为在eduline/settings.py文件里面:DEBUG = True,所以我们需要修改它为False,还有下面的允许访问IP地址,否则404页面也是出不来的:

DEBUG = False

ALLOWED_HOSTS = ['*']

这样重新运行一下我们的项目,发现页面有了,但是样子却没加载出来,这是为什么呢?

因为DEBUG为True时,系统会自动前往STATICFILES_DIRS下寻找文件的。所以我们开始一般都会选择True,便于错误信息的显示。

但是一旦DEBUG为False时,情况就不一样了,Django就不会代管你的静态文件了,而事实上一般静态文件都是通过第三方http服务器来代理转发。(如常见的服务器Nignx 和 Apache都会自动代理这些静态文件)

为了解决上述问题,我们这样做:打开eduline/settings.py文件,新增代码如下:

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

同时将里面的STATICFILES_DIRS给注释掉(这一步很重要,否则系统还是去找这个文件,事实上是找不到的,所以还是图片加载不出来):

# STATICFILES_DIRS = [
#     os.path.join(BASE_DIR, "static"),  # 说明静态文件放在哪个目录,记住这里只能用列表或者元组,单一一个元组需要用,结尾
# ]

打开eduline/urls.py文件,新增代码如下:

from eduline.settings import  STATIC_ROOT

 # 配置静态文件上传的访问处理url
    re_path('static/(?P<path>.*)', serve, {"document_root": STATIC_ROOT}),

现在重新运行我们的项目,看看404是不是出来了。

500的页面的配置和这个一模一样(注意函数名为page_error),这里就不再赘述了。

至此,本篇关于全局页面配置的介绍就到此为止了,感谢你的赏阅。

本篇笔记对应于第二十四篇代码,对应于github的位置是https://github.com/licheetools/eduline

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hbbliyong

web程序打包详解

   重要更新:鉴于很多小伙伴们说看不到图,我这边换了几个浏览器看了下,都看得到的,估计是网速问题,请耐心等待,另外,为了更好的方便大家学习,特此提供源码以及一...

46370
来自专栏有刻

Linux 小记 — Ubuntu 自动化配置

400100
来自专栏Java帮帮-微信公众号-技术文章全总结

kettle学习【大牛经验】

ETL是EXTRACT(抽取)、TRANSFORM(转换)、LOAD(加载)的简称,实现数据从多个异构数据源加载到数据库或其他目标地址,是数据仓库建设和维护中的...

67120
来自专栏小程序容器

OpenApplus小程序容器

OpenApp+ (https://www.openapplus.com)一个小程序容器,配置简单、功能完善、界面流畅、开箱即用!使用OpenApp+可以快速扩...

67990
来自专栏技术博客

ExtJs九(ExtJs Mvc用户管理之一)

首先要做的是为用户信息创建一个模型,在Scripts\app\model目录下创建一个名为User.js的文件,然后添加以下模型定义代码:

13620
来自专栏西安-晁州

vuejs、eggjs、mqtt全栈式开发设备管理系统

vuejs、eggjs、mqtt全栈式开发简单设备管理系统 业余时间用eggjs、vuejs开发了一个设备管理系统,通过mqtt协议上传设备数据至web端实时展...

3.2K70
来自专栏大史住在大前端

javascript基础修炼(6)——前端路由的基本原理

现代前端开发中最流行的页面模型,莫过于SPA单页应用架构。单页面应用指的是应用只有一个主页面,通过动态替换DOM内容并同步修改url地址,来模拟多页应用的效果,...

19030
来自专栏葡萄城控件技术团队

SoapUI实践:自动化测试、压力测试、持续集成

17620
来自专栏企鹅号快讯

使用技巧精讲

1、快速建立连接 单击顶部活动菜单栏上的“快速建立连接按钮”(Alt+Q),如图1 图1 单击按钮后,弹出图2所示的窗口 ? 图2 Protocol:默认SSH...

22350
来自专栏猿说1024

Linux 常用脚本

52130

扫码关注云+社区

领取腾讯云代金券