前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >零基础使用Django2.0.1打造在线教育网站(二十四):全局页面配置

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

原创
作者头像
啃饼思录
发布2018-09-13 21:52:38
7870
发布2018-09-13 21:52:38
举报

关于博主

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

代码语言:txt
复制
                                      微信公众号:  啃饼思录
代码语言:txt
复制
                                    QQ: 2810706745(啃饼小白)

写在前面

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

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

首页登出实现

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

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

代码语言:txt
复制
from users.views import LogoutView

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

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

代码语言:txt
复制
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函数,新增以下代码:

代码语言:txt
复制
course.students += 1
course.save()

就是这个样子:

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

代码语言:txt
复制
teacher.click_nums += 1
teacher.save()

就是这个样子:

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

代码语言:txt
复制
course_org.click_nums += 1
course_org.save()

就是这个样子:

收藏数配置

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

代码语言:txt
复制
# 用户收藏与取消收藏功能
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文件,新增以下代码:

代码语言:txt
复制
# 用户进入个人中心之后,清空未读消息
        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文件,代码修改为:

代码语言:txt
复制
    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:

代码语言:txt
复制
from users.views import IndexView

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

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

代码语言:txt
复制
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文件,新增代码如下:

代码语言:txt
复制
# 全局404页面配置
handler404 = 'users.views.page_not_found'

就是这个样子:

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

代码语言:txt
复制
# 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页面也是出不来的:

代码语言:txt
复制
DEBUG = False

ALLOWED_HOSTS = ['*']

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

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

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

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

代码语言:txt
复制
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

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

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

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

代码语言:txt
复制
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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于博主
  • 写在前面
  • 首页登出实现
  • 点击数加1
  • 收藏数配置
  • 小喇叭消息已读配置
  • 首页的开发
  • 404和500页面的配置
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档